2008年3月アーカイブ

先日のimm制御はBASEフォームのグリッドコントロールでは使えなかったための逃げ道。
グリッドではカラムごとのイベントは発生しない仕様なのかインプリメントされていないのか
とにかく使えないので、グリッドコントロールそのもののイベントを処理する。
幸いイベントに引数が与えられるので、それを見て判断する。渡される引数の詳細は酒がさめて から書く。

関連付けるイベントは「キーが離されたとき(だったかな)」。
このイベントは実際には「キーが離された」ときではなく、「キー入力処理が終わった後」のようだ。
おかげで CurrentColumnPosition が期待した値を持っている。
LeftAllow や RightAllow でカラムを移動した場合などキー入力の細かいことは無視(忘れたことに)する。

' --------------------------------------
sub immMode(Column as integer)

	select case Column
	case 0: immOff	' CODE
	case 1: immOff	' サイズ
	case 2: immOff	' 単位
	case 3: immOn	' 備考
	end select

end sub

' --------------------------------------
sub OnKeyUp(arg as object)

	select case arg.KeyCode
	case 1280,1282:	'[ENT],[TAB]
		immMode(arg.Source.CurrentColumnPosition)
	end select

end sub

' --------------------------------------
sub OnMouseClick(arg as object)
	immMode(arg.Source.CurrentColumnPosition)
end sub

初期化時の Tips

OpenOffice.org Baseフォームを読み込んだときに実行するマクロ。
フォームを読み込んだ直後は Standard ライブラリしかロードされていないので、
マイライブラリのスタンダードに初期化処理の呼び出しを書く。

[mylib.Standard.INIT]
sub OnLoad
	GlobalScope.BasicLibraries.LoadLibrary("originalLib")
	OnInitForms()
end sub


こちらはドキュメントを初期化する処理。
[.originalLib.somemodule]
' --------------------------------------
'	各フォームの初期化
'
sub OnInitForms

	select case ThisComponent.DrawPage.Forms.getByIndex(0).Name
	case "Form1":	InitForm1()
	case "Form2":	InitForm2()
	end select
	
end sub
OOo のライブラリをエクスポートして 拡張機能 にまとめることができるが。普通にやると拡張機能マネージャでバージョンが教示されない。
バージョンの表示される拡張機能にするための手順。

1) まずマクロオーガナイザーライブラリタブ でライブラリを「拡張機能としてエクスポート」する。

2) 拡張機能マネージャー でエクスポートした拡張機能を「追加」する。

3) もう一度マクロオーガナイザで追加したライブラリを見て、どこにキャッシュされたかを調べる。
"C:\Documents and Settings\USERNAME\Application Data\OpenOffice.org2\user\uno_packages\cache\uno_packages\番号.tmp_\ライブラリ名.oxt" なんてとこにあるはず。

4) キャッシュ先の ライブラリ名.oxt ディレクトリに description.xml という名で以下のような内容のファイルを作る。
<version value="x.y.z" /> のとこ以外 <identifier value="YourLibraryName.oxt" /> と
<display-name> 〜 </display-name> はなくても問題ない。今日のお題は「バージョンを表示」ですから。
<identifier value="YourLibraryName.oxt" /> の拡張子を省略したらアンインストールで失敗した。

ここまでが準備
5) こんどは 拡張機能マネージャー で改めてエクスポートしなおす。これでやっと、バージョン情報などが記録された拡張機能が生成される。


[description.xml]
<?xml version="1.0" encoding="UTF-8"?>
  <description xmlns="http://openoffice.org/extensions/description/2006"
    xmlns:d="http://openoffice.org/extensions/description/2006"
    xmlns:xlink="http://www.w3.org/1999/xlink">
  <identifier value="YourLibraryName.oxt" />  ← ライブラリ名を設定 
  <version value="0.1.0123" /> ←  バージョン番号を設定 
  <dependencies>
    <OpenOffice.org-minimal-version value="2.0" d:name="OpenOffice.org 2.0"/>
  </dependencies>
  <display-name>
    <name lang="en">YourLib EXTENTION</name>  ← 英語の表示名(たぶん) 
    <name lang="ja">YourLib 拡張機能</name>  ←日本語の表示名 
  </display-name>
</description>

IME を操作する OpenOffice.org マクロを作ってみた。
Windows 専用である。
フォームへの入力が多少改善されると思う。
フォームではテキストボックスのフォーカス取得イベントにモード切替のマクロを割り当てて使う。 BASICでは InputBox関数の前に呼び出せばいい。

サンプル ドキュメント (imm_sample.odt)

REM  *****  BASIC  *****

Option Explicit	' 宣言のない変数はエラー

const SYSTEM_WIN32 as long 	= 1
const SYSTEM_WIN16 as long 	= 2
const SYSTEM_JAVA as long 	= 3
const SYSTEM_OS2 as long 	= 4
const SYSTEM_MAC as long 	= 5
const SYSTEM_XWINDOW as long	= 6

const IME_CMODE_ALPHANUMERIC as long	= 0	' アルファベット
const IME_CMODE_NATIVE as long		= 1	' 日本語(各国語)
const IME_CMODE_JAPANESE as long	= 1	' = IME_CMODE_NATIVE
const IME_CMODE_KATAKANA as long	= 2	' カタカナ/ひらかな
const IME_CMODE_LANGUAGE as long	= 3	' 言語マスク?
const IME_CMODE_FULLSHAPE as long	= &h008	' 全角/半角
const IME_CMODE_ROMAN as long		= &h010	' ローマ字入力
const IME_CMODE_CHARCODE as long	= &h020	' コード入力
const IME_CMODE_HANJACONVERT		= &h040	'
const IME_CMODE_SOFTKBD as long		= &h080	' ソフトウェアキーボード
const IME_CMODE_NOCONVERSION as long	= &h100	' 
const IME_CMODE_EUDC as long		= &h200	' EUDC(ってなんだ?)
const IME_CMODE_SYMBOL as long		= &h400	' シンボル記号(英数の?)
const IME_CMODE_FIXED as long		= &h800	'


' ----------------------------------------------------------------------
'	sample main
'
Sub Main
	immOff
	inputBox "ASCII"

	immKata
	inputBox "カタカナ"

	immHIra
	inputBox "ひらかな"
	
	immKbd
	inputBox "KEYBORD"
	
	immCode
	inputBox "CHRCODE"
	
	imm(FALSE)
end sub


' ----------------------------------------------------------------------
'	imm32.dll
'
Declare Function ImmGetContext		Lib "imm32.dll" (ByVal hWnd as long) as long
Declare Function ImmReleaseContext	Lib "imm32.dll" (ByVal hWnd as long, ByVal hIMC as long) as long
Declare Function ImmSetOpenStatus	Lib "imm32.dll" (ByVal hIMC as long, ByVal bOpen as long) as long
Declare Function ImmGetOpenStatus	Lib "imm32.dll" (ByVal hIMC as long)  as long
Declare Function ImmGetConversionStatus	Lib "imm32.dll" (ByVal hIMC as long, cmode as long, smode as long) as long
Declare Function ImmSetConversionStatus	Lib "imm32.dll" (ByVal hIMC as long, ByVal cmode as long, ByVal smode as long) as long

' ----------------------------------------------------------------------
'	IME制御
'
sub imm(sw as long, optional mode as long)

	if IsMissing(mode) then mode = IME_CMODE_JAPANESE + IME_CMODE_FULLSHAPE
	dim hWND as long
	dim hIMC as long
	dim PID() as byte
	
	hWND =  StarDesktop.ActiveFrame.ContainerWindow.getWindowHandle(PID, SYSTEM_WIN32)
	hIMC = ImmGetContext(hWnd)
	
	ImmSetOpenStatus(hIMC, sw)

	if (sw) then
		dim cmode as long, smode as long
		ImmGetConversionStatus(hIMC, cmode, smode)
		ImmSetConversionStatus(hIMC, mode, smode)
	end if
	
	ImmReleaseContext(hWND,hIMC)

End Sub

' ----------------------------------------------------------------------
'	IME ON
sub immOn
	imm(TRUE, IME_CMODE_JAPANESE+IME_CMODE_FULLSHAPE)
end sub

' ----------------------------------------------------------------------
'	IME OFF
sub immOff
	imm(FALSE)
end sub

' ----------------------------------------------------------------------
sub immHira
	imm(TRUE, IME_CMODE_JAPANESE+IME_CMODE_FULLSHAPE)
end sub

' ----------------------------------------------------------------------
sub immKata
	imm(TRUE, IME_CMODE_JAPANESE+IME_CMODE_KATAKANA+IME_CMODE_FULLSHAPE)
end sub

' ----------------------------------------------------------------------
sub immCode
	imm(TRUE, IME_CMODE_JAPANESE +IME_CMODE_FULLSHAPE+ IME_CMODE_CHARCODE)
end sub

' ----------------------------------------------------------------------
sub immKbd
	imm(TRUE, IME_CMODE_JAPANESE+IME_CMODE_FULLSHAPE+IME_CMODE_SOFTKBD)
end sub

2.4Rc2 に見つけたバグ

OpenOffice.org 2.3 の BASE ではフォームのマクロがなぜか読み込まれない不具合があって、フォームの OnLoad イベントに割り当てたマクロが、スクリプトがねえよ馬鹿野郎!とかメッセージが出てきて「馬鹿はてめえだろ」と罵っていた。

マクロのロード前にマクロを呼び出しを行ってしまう早漏野郎なのか、マクロの読み込みそのものを忘れている痴呆症なのか知らんが、使えねえ奴だった。

対策として「ドキュメントマクロを捨ててアプリケーションマクロで処理する」ことにした。これはこれでなんとかなりそうだった。

ところが今度出てくる OOo2.4 ではこの早漏痴呆機能は改善されたが、フォームのイベントをアプリケーションマクロに割り当てると、どのフォームも同じマクロにアサインされてしまうようだ。

つまり FORM-A のイベントになにかマクロを割り当てると、おなじイベントなら FORM-B でも FORM-C でも、すべて FORM-A のマクロが実行される。割付がドキュメントマクロならばなんとか動くみたい。

2.3の早漏痴呆対策でドキュメントマクロをすべてアプリケーションマクロに変えていたのを、もう一度ドキュメントマクロに直さにゃならん。

OOo はやっぱり永遠のαバージョンなのか?
(MS-Windows の永遠のα版よりましだけど)

Sunbird & Lightning 0.8RC

もじらカレンダープロジェクト( http://www.mozilla.org/projects/calendar/ )の 0.8 RC のダウンロード先

スタンドアロン Sunbird:
http://releases.mozilla.org/pub/mozilla.org/calendar/sunbird/releases/0.8rc1/

Thunderbird の組み込み Lightning:
http://releases.mozilla.org/pub/mozilla.org/calendar/lightning/releases/0.8rc1/

Googl Calendar との連携 gdata-provider-2008-03-14-19.xpi:
http://downloads.mozdev.org/gdataprovider/
これの所在を知らないがために、今日は半日 "provider_for_google_calendar-0.3.1-tb+sb.xpi" で何とか接続できないかと悪あがきをしていた。無駄だった。

OpenOffice.org のヘルプで、「表示されるフォントが小さくつぶれて醜い見にくい。読みづらい」、と感じていたのでなんとかならんか、と思いやってみた。
ら、意外と簡単に問題解決。
まず、 C:\Program Files\OpenOffice.org 2.x\help\ja\default.css をエディタで開く。
そして以下の行(36行目から)を見つけて編集する。

[変更前]

p, td
	{ font-size: 10pt; }

h1
	{ font-size: 18pt; border-bottom: 1px solid black; padding-bottom: 6px; margin-bottom: 6px;}

h2
	{ font-size: 14pt; }

h3
	{ font-size: 12pt; }

h4, h5, h6
	{ font-size: 10pt; }

[変更後]
p, td
	{ font-size: 12pt; }

h1
	{ font-size: 20pt; border-bottom: 1px solid black; padding-bottom: 6px; margin-bottom: 6px;}

h2
	{ font-size: 16pt; }

h3
	{ font-size: 14pt; }

h4, h5, h6
	{ font-size: 12pt; }

そして保存後 OOo を起動。
これでだけでずいぶんと見やすくなった。
Windows 以外の版でもほぼ同様だと思う。

皮肉を書くのだけどね。

OpenOffice.org 2.4 がもうすぐリリースされるかもしれない。
このバージョンでは BASE に画期的な改善が施されている。
なんと、View が編集可能になっているのだ。従来のバージョンからみると
信じられないくらいの進歩である(自分比)。

もうひとつは、BASE 内のマクロ付フォームを開いたときに、
フォルダを信頼できるソースに登録していても「マクロを有効にするか?」と
聞いてくるのがなくなった。これで会社の事務の娘たちにも使わせやすくなる。

それからおなじくマクロ付フォームを開くときに、フォームとマクロが非同期に
読み込まれていたのか OnLoad イベントが起きてもドキュメントマクロが見つからない
というフライングというか早漏というかのようなエラーが(今のところ)出てこないようだ。

The requested page could not be found.

Smarty error: [plugin] modifier ' ' is not implemented (core.load_plugins.php, line 118)