SSブログ

NSTextViewオブジェクトをNSScrollViewに配置する [AppleScript辞書はつくれるか?]

長らくお休みをしておりましたが、この間に最強クラスの敵(?)を倒すことができました。

なんて、ここ最近、わたしを悩ませていたNSTextViewがようやく理解できたので喜んでおります。

 

テキストを扱う兄弟分にはNSTextFieldというものがありますが、あちらは基本的には1行のテキストを扱うものでした。

一方、今回話題にしています、NSTextViewは複数行も対応したテキスト用のオブジェクトになるわけですが、表示範囲からはみ出した部分はスクロールバーが表示されて、それを移動することによって表示を可能にしています。

機能は分かっていますし、このクラスのリファレンスは読んでみたのですが、いまいちまともに表示ができなく苦しんでおりましたが、検索していくうちに公式の説明文がヒット!

あっという間に解決してしまったのです。なかなかここにたどり着けなかった自分が恥ずかしいです。

ということで、こちらがそのページなのですが、


 読んでわかる通り、NSTextViewを正しく使用するにはNSScrollViewが必要だと書かれています。まぁ、これは気付いていたのですが、それをどのようにスクリプトで書いたらいいのかわからなく、探しておりました。

以下、ページを和訳してみました。

 

----------

アプリケーションでは通常、スクロールテキストビューが必要です。InterfaceBuilderは、この目的のためだけに構成されたNSTextViewを提供します。 ただし、プログラムでスクロールテキストビューを作成する必要がある場合があります。

 

このプロセスは、NSScrollViewの設定、NSTextViewの設定、およびピースの組み立てという3つのステップで構成されています。 この記事では、垂直スクロールバーのみで構成された典型的なテキストビューの観点からこれらの手順を説明し、次に水平スクロールバーの構成に使用される代替ステートメントを示します。

 

スクロールビューの設定

オブジェクトに、スクロールビューが表示されるウィンドウを表す変数theWindowがあるとすると、リスト1のコードを使用してNSScrollViewを設定できます。

 

リスト1 スクロールビューの設定

NSScrollView *scrollview = [[NSScrollView alloc]

            initWithFrame:[[theWindow contentView] frame]];

NSSize contentSize = [scrollview contentSize];

 

[scrollview setBorderType:NSNoBorder];

[scrollview setHasVerticalScroller:YES];

[scrollview setHasHorizontalScroller:NO];

[scrollview setAutoresizingMask:NSViewWidthSizable |

            NSViewHeightSizable]; 

 

このコードは、表示されるウィンドウのコンテンツ領域を完全にカバーするNSScrollViewを作成することに注意してください。このスクロールテキストビューは、NSTextViewの水平範囲内でテキストをラップするため、垂直スクロールバーを指定しますが、水平スクロールバーは指定しません。 NSTextViewの垂直範囲を超えるテキストフロー。 水平スクロールバーを使用するには、水平スクロールバーの設定で説明されているように、スクロールビューとテキストビューを少し異なるように設定する必要があります。

 

最後に、コードは、NSScrollViewが表示されているウィンドウのサイズが変化したときのNSScrollViewの反応を設定します。 サイズ変更マスクのNSViewWidthSizableビットとNSViewHeightSizableビットをオンにすると、ウィンドウのサイズに合わせてNSScrollViewが拡大および縮小します。

 

テキストビューの設定

次のステップは、NSScrollViewに収まるようにNSTextViewを作成および構成することです。 リスト2は、このステップを実行するステートメントを示しています。

 

リスト2 テキストビューの設定

theTextView = [[NSTextView alloc] initWithFrame:NSMakeRect(0, 0,

            contentSize.width, contentSize.height)];

[theTextView setMinSize:NSMakeSize(0.0, contentSize.height)];

[theTextView setMaxSize:NSMakeSize(FLT_MAX, FLT_MAX)];

[theTextView setVerticallyResizable:YES];

[theTextView setHorizontallyResizable:NO];

[theTextView setAutoresizingMask:NSViewWidthSizable];

 

[[theTextView textContainer]

            setContainerSize:NSMakeSize(contentSize.width, FLT_MAX)];

[[theTextView textContainer] setWidthTracksTextView:YES];

 

リスト2は、NSTextViewの幅と高さが最初はNSScrollViewのコンテンツ領域の幅と高さに一致することを示しています。 setMinSize:メッセージはNSTextViewに、幅を任意に小さくできますが、初期の高さ以上にすることができることを伝えます。 setMaxSize:メッセージにより、レシーバーはいずれかの次元で任意に成長できます。 これらの制限は、レイアウトされたテキストに合わせてNSTextViewのサイズを変更するときにNSLayoutManagerによって使用されます。

 

次の3つのメッセージは、テキストの追加または削除、およびスクロールビューのサイズの変化に応じて、NSTextViewの寸法がどのように変化するかを決定します。 NSTextViewは、テキストが追加されるときに垂直方向に拡大するように設定されていますが、水平方向には拡大されません。 そのサイズ変更マスクは、スーパービューの幅の変更に応じて幅を変更できるように設定されています。 最小値と最大値を除いて、NSTextViewの高さは、そこに含まれるテキストの量によって決定されるため、その高さはスーパービューの高さと変化してはなりません。

この手順の最後の2つのメッセージは、NSTextViewではなく、NSTextContainerに対するものです。 1つのメッセージは、テキストコンテナーの初期幅をスクロールビューの幅に設定し、高さをテキストビューの最大サイズに設定します。 最後のメッセージは、NSTextContainerに、NSTextViewの幅に従って幅を変更するように指示しています。 テキストシステムは、NSTextContainerオブジェクトに格納された次元に従ってテキストをレイアウトすることを思い出してください。 NSTextViewはテキストを表示する場所を提供しますが、その寸法とNSTextContainerの寸法はまったく異なる場合があります。 setWidthTracksTextViewYESメッセージは、NSTextViewのサイズが変更されると、そのNSTextContainerに格納されている幅寸法も同様にサイズ変更され、テキストが新しい境界内にレイアウトされるようにします。

 

ピースの組み立て

最後のステップは、ピースを組み立てて表示することです。 リスト3は、このステップを実行するステートメントを示しています。

 

リスト3 ピースの組み立て

[scrollview setDocumentView:theTextView];

[theWindow setContentView:scrollview];

[theWindow makeKeyAndOrderFront:nil];

[theWindow makeFirstResponder:theTextView];

 

水平スクロールバーの設定

水平スクロールバーと垂直スクロールバーの両方を設定するには、前のリストの対応するステートメントの代わりにリスト4のステートメントを使用します。

 

リスト4 水平スクロールバーの設定

[[theTextView enclosingScrollView] setHasHorizontalScroller:YES];

[theTextView setHorizontallyResizable:YES];

[theTextView setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)];

[[theTextView textContainer] setContainerSize:NSMakeSize(FLT_MAX, FLT_MAX)];

[[theTextView textContainer] setWidthTracksTextView:NO];

 

このコードフラグメントは、水平スクロールバーをスクロールビューに追加し、テキストビューを水平方向にサイズ変更できるようにして、任意の幅のテキストを表示できるようにします。 このコードは、テキストビューのサイズ変更マスクを設定して、スーパービューの対応する変更に応じて幅と高さの両方が変更されるようにします。 最後から2番目のメッセージは、テキストコンテナーの両方の寸法を任意の大きな値に設定します。これは、本質的にテキストが1つの長い行にレイアウトされることを意味し、最後のメッセージは、テキストコンテナーがテキストビューで水平方向にサイズ変更されないことを保証します





そして、この記事を参考にApplescriptに変更を試してみました。

  

   property parent : class "NSObject"

   property theWindow : missing value

    

    property NSScrollView : class "NSScrollView"

 

    property NSTextView : class "NSTextView"

    property NSTextContainer : class "NSTextContainer"

    property NSTextStorage : class "NSTextStorage"

    property NSLayoutManager : class "NSLayoutManager"

    property NSColor : class "NSColor"

    

    on applicationWillFinishLaunching_(aNotification)

        set theSize to current application's NSMakeSize(500,400)

        theWindow's setContentSize_(theSize)

        set mainView to theWindow's contentView()

        

        -----

 

        --NSScrollView *scrollview = [[NSScrollView alloc] initWithFrame:[[theWindow contentView] frame]];

        set scrollview1 to NSScrollView's alloc()'s initWithFrame_(theWindow's contentView()'s frame())

        --NSSize contentSize = [scrollview contentSize];

        set contentSize1 to scrollview1's contentSize()

        --[scrollview setBorderType:NSNoBorder];

        scrollview1's setBorderType_(0) --| NSNoBorder = 0 |

        --[scrollview setHasVerticalScroller:YES];

        scrollview1's setHasVerticalScroller_(true)

        --[scrollview setHasHorizontalScroller:NO];

        scrollview1's setHasHorizontalScroller_(false)

        --[scrollview setAutoresizingMask:NSViewWidthSizable NSViewHeightSizable];

        scrollview1's setAutoresizingMask_(18) --| オートリサイズ : 高さと幅を自由伸縮 = 18 |

 

        -----

        

        --theTextView = [[NSTextView alloc] initWithFrame:NSMakeRect(0, 0, contentSize.width, contentSize.height)];

        set theTextView1 to NSTextView's alloc()'s initWithFrame_(current application's NSMakeRect(0,0, contentSize1's width, contentSize1's height))

        --[theTextView setMinSize:NSMakeSize(0.0, contentSize.height)];

        theTextView1's setMinSize_(current application's NSMakeSize(0.0, contentSize1's height))

        --[theTextView setMaxSize:NSMakeSize(FLT_MAX, FLT_MAX)];

        theTextView1's setMaxSize_(current application's NSMakeSize(10000,10000)) --|FLT_MAX, FLT_MAXにか替わるものがないので大きな数値 |

        --[theTextView setVerticallyResizable:YES];

        theTextView1's setVerticallyResizable_(true)

        --[theTextView setHorizontallyResizable:NO];

        theTextView1's setHorizontallyResizable_(false)

        --[theTextView setAutoresizingMask:NSViewWidthSizable];

        theTextView1's setAutoresizingMask_(2)  --| オートリサイズ : 幅を自由伸縮 = 2 |

        --[[theTextView textContainer] setContainerSize:NSMakeSize(contentSize.width, FLT_MAX)];

        theTextView1's textContainer()'s setContainerSize_(current application's NSMakeSize(contentSize1's width, 10000))

        --[[theTextView textContainer] setWidthTracksTextView:YES];

        theTextView1's textContainer's setWidthTracksTextView_(true)

 

        -----

        

        --[scrollview setDocumentView:theTextView];

        scrollview1's setDocumentView_(theTextView1)

        --[theWindow setContentView:scrollview];

        theWindow's setContentView_(scrollview1)

        --[theWindow makeKeyAndOrderFront:nil];

        theWindow's makeKeyAndOrderFront_(missing value)

        --[theWindow makeFirstResponder:theTextView];

        theWindow's makeFirstResponder_(theTextView1)

        

    end applicationWillFinishLaunching_

 

 リスト4は書きませんでしたが、ここまでを参考にすれば理解できると思います。

 


nice!(0)  コメント(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。