Top > OOobbs > 50

OOobbs/50 Edit

  • サマリ: テキストボックス内でテキストを選択した時のOpenOffice.orgバージョンの違いによる挙動の差異
  • 環境: Draw
  • 状態: 投稿
  • 投稿者: 河井?
  • 投稿日: 2005-02-25 (金) 18:30:09

質問 Edit

CurrentSelection を取得して選択されたオブジェクトを扱うマクロを書いていましたが、OpenOffice 1.9m79 では、操作状況により返されるオブジェクトや名称が異なる事が判りましたので以下にまとめておきます。

getCurrentSelection() で得られるオブジェクト Edit

テキストボックス内でテキストを選択した時

OpenOffice 1.14
内部名:SvxShapeCollection
サポートされるインターフェイス:
com.sun.star.container.XElementAccess 
com.sun.star.container.XIndexAccess
com.sun.star.drawing.XShapes
com.sun.star.lang.XComponent
com.sun.star.lang.XServiceInfo 
com.sun.star.lang.XTypeProvider 
com.sun.star.uno.XAggregation
com.sun.star.uno.XInterface
com.sun.star.uno.XWeak

OpenOffice 1.9m79
内部名:SvxUnoTextCursor
サポートされるインターフェイス:
com.sun.star.beans.XMultiPropertySet 
com.sun.star.beans.XPropertySet
com.sun.star.beans.XPropertyState 
com.sun.star.lang.XServiceInfo
com.sun.star.lang.XTypeProvider 
com.sun.star.lang.XUnoTunnel
com.sun.star.text.XTextCursor 
com.sun.star.text.XTextRange
com.sun.star.text.XTextRangeCompare 
com.sun.star.uno.XInterface


テキストボックスそのものを選択した時の処理

OpenOffice 1.14
内部名:SvxShapeCollection
サポートされるインターフェイス:
com.sun.star.container.XElementAccess 
com.sun.star.container.XIndexAccess 
com.sun.star.drawing.XShapes 
com.sun.star.lang.XComponent
com.sun.star.lang.XServiceInfo 
com.sun.star.lang.XTypeProvider 
com.sun.star.uno.XAggregation 
com.sun.star.uno.XInterface 
com.sun.star.uno.XWeak 

OpenOffice 1.9m79
内部名:com.sun.star.drawing.SvxShapeCollection
サポートされるインターフェイス:
com.sun.star.container.XElementAccess 
com.sun.star.container.XIndexAccess 
com.sun.star.drawing.XShapes 
com.sun.star.lang.XComponent
com.sun.star.lang.XServiceInfo 
com.sun.star.lang.XTypeProvider 
com.sun.star.uno.XAggregation
com.sun.star.uno.XInterface
com.sun.star.uno.XWeak 


対処 Edit

こうした状況に対応する為に以下の様なコードを書く事で解決しました。

REM **************************************************
REM *** Draw/Impress/Calc/Writer で、選択された DrawPage 上
REM *** のオブジェクトのサイズ情報を取得するサンプル
REM *** -- OpenOffice 1.9m79 以降への対応化 --
REM **************************************************
Sub GetSelObjSize
Dim Doc As Object
Dim Page As Object
Dim Shapes As Object
Dim Group As Object
Dim objX As Double, objY As Double, objW As Double, objH As Double
	Doc = StarDesktop.CurrentComponent
	Page = GetDrawPageAllways(Doc)
'-- Debug tool としてXray 使用していない時はコメント化
'		Globalscope.BasicLibraries.LoadLibrary( "Xray" )
'		Xray.Xray Page
	Shapes = Doc.getCurrentSelection()
	if IsNull(Shapes) then
		MsgBox "選択されたオブジェクトはありません。"
'	サービス名を取得しているとバージョンによって値が変化するので好ましくない。
'	elseif Not Shapes.supportsService("com.sun.star.drawing.Shapes") then				' for 1.14
'	elseif Not Shapes.supportsService("com.sun.star.drawing.ShapeCollection") then	' for 1.9m79
	elseif Not HasUnoInterfaces(Shapes, "com.sun.star.drawing.XShapes") then		'--> 1.9m79 での挙動に対応
		MsgBox "選択されたオブジェクトは、サイズ情報取得対象ではありません。"
	else
		if Shapes.Count = 1 then			 '--> 1つの時はグループ化しない。(主として Writer への対応措置)
			Group = Shapes.getByIndex(0)
		else
			' 選択されたオブジェクトをグループ化
			Group = Page.group(Shapes)
		end if
		' 選択されたオブジェクトの情報表示
		objW = Group.Size.Width / 100 : objH = Group.Size.Height / 100
		if IsDrawOrImpress(Doc) then
			objX = (Group.Position.X - Page.BorderLeft) / 100 : objY = (Group.Position.Y - Page.BorderTop)/ 100
		else
			objX = Group.Position.X / 100 : objY = Group.Position.Y / 100
		end if
		
		MsgBox "【選択されたオブジェクトについて】" & chr$(13) & _
					"幅:" & objW & "mm 高さ:" & objH & "mm" & chr$(13) & _
					"X座標:" & objX & "mm Y座標:" & objY & "mm"
		' 選択されたオブジェクトをグループ解除
		if Shapes.Count > 1 then
			Page.ungroup(Group)
		end if
	end if
	
End Sub

Sub IsWriter(oDocument As Object) As Boolean
	IsWriter = oDocument.supportsService("com.sun.star.text.TextDocument")
End Sub

Sub IsDrawOrImpress(oDocument As Object) As Boolean
	if oDocument.supportsService("com.sun.star.drawing.DrawingDocument") or _
	oDocument.supportsService("com.sun.star.presentation.PresentationDocument") then
		IsDrawOrImpress = True
	else
		IsDrawOrImpress = False
	end if
End Sub

Sub GetDrawPageAllways(oDocument As Object) As Object
	'-- Draw or Impress
	if oDocument.supportsService("com.sun.star.drawing.DrawingDocument") or _
		oDocument.supportsService("com.sun.star.presentation.PresentationDocument") then
		GetDrawPageAllways = oDocument.CurrentController.getCurrentPage()
		Exit Sub
	'-- Calc
	elseif oDocument.supportsService("com.sun.star.sheet.SpreadsheetDocument") then
		GetDrawPageAllways = oDocument.CurrentController.ActiveSheet.getDrawPage()
		Exit Sub
	'-- Writer
	elseif oDocument.supportsService("com.sun.star.text.TextDocument") then
		GetDrawPageAllways = oDocument.CurrentController.Model.getDrawPage()
		Exit Sub
	'-- other, DB?
	else
		
	end if
End Sub

回答 Edit

  • OOobbs の一覧での表示がおかしくなってしまいました。直らないようなら一度削除してもらえます?改めて書きますので。 -- 河井? 2005-02-25 (金) 18:56:48
  • ページの上のほうの「** 質問」の部分を変更するとおかしくなってしまうようです。おかしくならないようにできれば行ってみます。 -- はにゃ?? 2005-02-26 (土) 00:48:05
  • 対応ありがとうございます。ReSizePlus? を変更している内にマクロを書く人にとってはかなり重要な OpenOffice.org のバージョンによる動作の違いが判った事と、汎用的に利用できる部分が出てきた事がありましたので、DrawPage へのアクセスサンプルの1つとして誰もが自由に利用出来る様に汎用的な部分のみを取り出した形で改めてソースを書き直してみました。コード内コメントにも書いてありますが、Writer でのみ group("対象オブジェクト") を利用するときは、対象オブジェクトが1つだとグループ化されず、Null が戻り値で返ってきます。動作としては、このような Writer の実装が正しい仕様には思えます。他にも上記コード内で DrawPage のいくつかのメソッドやプロパティを利用していますが、私はこれらを体系的にまとめる事は苦手ですので、OOoBasic でまとめてもらえれば幸いです。 -- 河井? 2005-02-27 (日) 09:23:49
  • Calc に関する部分をほぼまとめ上げた後,次にどれを取り上げようか考えていたところです。少し調べてみます。 -- はにゃ?? 2005-02-27 (日) 12:22:49
  • ありがとうございます。DrawPage を体系的に把握できていない為、不具合が発生した時にReSizePlus? においては場当たり的な対処しかできておりません。上記コードには含まれていない箇所で、 Writer への対応化を図る際に発生した不具合が他にもあります。"はにゃ"さんが調べて下さる際に、なんらかの手掛かりになるかもしれませんので、改めて別件で整理してここに書いてみます。 -- 河井? 2005-02-27 (日) 13:10:00


Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup   Help   RSS of recent changes