Google Apps Scriptを使ってみる(1)

Google Apps Scriptで使用できるJavaScript

JavaScript 1.6をベースに、1.7や1.8のいくつかの機能が使える。(Basic JavaScript features)

Apps Scriptはサーバーサイドで実行されるため、Window.alert()やWindow.console.log()などのWindow APIは使用できない。

Logger

Window.console.log()が使えない代わりに、Logger.log()が使える。

Logger.log("Hello");

出力したログは、エディターのメニュー「表示」→「ログ」で確認できる。

msgBox

Window.alert()やWindow.prompt()が使えない代わりに、Browser.msgBox()が用意されている。

function msgBox() {
    Browser.msgBox("Hello");
}

function msgBox_OkCancel() {
    var result = Browser.msgBox("Hello", Browser.Buttons.OK_CANCEL);
    Logger.log(result);
}

function msgBox_YesNo() {
    var result = Browser.msgBox("Hello", Browser.Buttons.YES_NO);
    Logger.log(result);
}

function msgBox_TitlePrompt() {
    var result = Browser.msgBox("title", "prompt", Browser.Buttons.YES_NO_CANCEL);
    Logger.log(result);
}

Xamarin.Macでピンチイン・ピンチアウト

二本指で縮小(ピンチイン/pinch-in)や拡大(ピンチアウト/pinch-out)したときのイベントを受け取るサンプルアプリケーションです。

NSView上でピンチイン・ピンチアウトすると、倍率を表示します。

説明

ピンチイン・ピンチアウトの操作が行われると、MagnifyWithEventメソッドが呼ばれます。

引数NSEventのMagnificationプロパティで倍率を取得できます。

public override void MagnifyWithEvent(NSEvent theEvent)
{
    value = theEvent.Magnification;
    NeedsDisplay = true;
}

Xamarin.MacでNSColorWellを使う

Xamarin.MacでNSColorWellを使ったサンプルアプリケーションです。

色が選択されたときのイベントを設定する

色が選択されたときに実行する処理を、NSColorWellのActivatedイベントに登録します。

ColorWell.Activated += (sender, e) => { 実行する処理 }

NSColorWellで色が選択されるたびに、処理が実行されます。

RGBの各値を取得する

次のようにして、RGBの値を取得しています。

TextFieldR.IntValue = (int)(color.RedComponent * 255);
TextFieldG.IntValue = (int)(color.GreenComponent * 255);
TextFieldB.IntValue = (int)(color.BlueComponent * 255);

color.RedComponentのところで、次のエラーが発生することがありました。

Terminating app due to uncaught exception ‘NSInvalidArgumentException’, reason: ‘*** -getRed:green:blue:alpha: not valid for the NSColor Generic Gray Gamma 2.2 Profile colorspace 1 1; need to first convert colorspace.’ *** First throw call stack:

対策として、次のコードを入れています。

color = color.UsingColorSpace(NSColorSpace.GenericRGBColorSpace);

Xamarin.MacでNSBezierPathを使って点線を描画する

NSBezierPathのSetLineDash()メソッドに点線の設定をします。

SetLineDash()メソッドの最初の引数patternに、点線の線と空白の長さを指定します。

private void DrawLine()
{
    NSColor.Blue.Set();
    NSBezierPath path = NSBezierPath.FromRect(Bounds);
    path.LineWidth = (nfloat)LineWidth;

    nfloat[] pattern = { (nfloat)DashWidth, (nfloat)DashSpace };
    nfloat phase = 0;
    path.SetLineDash(pattern, phase);

    path.Stroke();
}

サンプルアプリケーションはこちら

Xamarin.Macで、ウィンドウのサイズが変更された時に通知を受け取る

Xamarin.Macで、ウィンドウのサイズが変更された時に通知を受け取るサンプルアプリケーションです。

ウィンドウのサイズが変更された時に通知を受け取り、ウィンドウサイズを表示します。

ソースコードはこちら。

次のコードで、ウィンドウサイズが変更された時に指定した処理が実行されます。

NSNotificationCenter.DefaultCenter.AddObserver(
    NSWindow.DidResizeNotification,
    (obj) => { 実行する処理 });

次のコードでは、ウィンドウサイズが変更された時に、PrintWindowSize()を実行して、ウィンドウサイズを表示しています。

NSNotificationCenter.DefaultCenter.AddObserver(
    NSWindow.DidResizeNotification,
    (obj) =>
    {
        PrintWindowSize();
    });

Xamarin.Macで、NSViewのマウスイベントの情報を取得する

Xamarin.Macで、NSViewのマウスイベントの情報を取得するサンプルアプリケーションです。

NSViewのマウスイベントの情報をログに出力します。

ソースコードはこちら。

次のようなコードで取得したイベントを出力しています。

public partial class MainView : NSView
{
    public override void MouseEntered(NSEvent theEvent) => Print(theEvent);
    public override void MouseExited(NSEvent theEvent) => Print(theEvent);
    public override void MouseMoved(NSEvent theEvent) => Print(theEvent);
    public override void MouseDown(NSEvent theEvent) => Print(theEvent);
    public override void MouseUp(NSEvent theEvent) => Print(theEvent);
    public override void MouseDragged(NSEvent theEvent) => Print(theEvent);
    public override void RightMouseDown(NSEvent theEvent) => Print(theEvent);
    public override void RightMouseUp(NSEvent theEvent) => Print(theEvent);
    public override void RightMouseDragged(NSEvent theEvent) => Print(theEvent);
    public override void ScrollWheel(NSEvent theEvent) => Print(theEvent);

    private void Print(NSEvent theEvent)
    {
        // イベントの種類
        NSEventType eventType = theEvent.Type;

        // ウィンドウ座標
        var windowLocation = theEvent.LocationInWindow;
        // ビュー座標
        var viewLocation = ConvertPointFromView(theEvent.LocationInWindow, null);
        // スクリーン座標
        var screenLocation = NSEvent.CurrentMouseLocation;

        // 押されている修飾キー
        var modifier = "";
        if ((theEvent.ModifierFlags & NSEventModifierMask.ShiftKeyMask) > 0) modifier += "Shift ";
        if ((theEvent.ModifierFlags & NSEventModifierMask.CommandKeyMask) > 0) modifier += "Command ";
        if ((theEvent.ModifierFlags & NSEventModifierMask.ControlKeyMask) > 0) modifier += "Ctrl ";
        if ((theEvent.ModifierFlags & NSEventModifierMask.AlternateKeyMask) > 0) modifier += "Alt ";
        modifier = modifier.Trim();

        // マウスイベントのボタン番号
        var button = theEvent.ButtonNumber;

        // 押されているマウスのボタン
        var buttons = "";
        if ((NSEvent.CurrentPressedMouseButtons & 1) > 0) buttons += "Left ";
        if ((NSEvent.CurrentPressedMouseButtons & 2) > 0) buttons += "Right ";
        buttons = buttons.Trim();

        // マウスホイールのスクロール量
        var scrollX = theEvent.DeltaX;
        var scrollY = theEvent.DeltaY;
        var scrollZ = theEvent.DeltaZ;

        var log = 
            $"EventType={eventType} " + 
            $"View=({Format(viewLocation.X)}, {Format(viewLocation.Y)}) " +
            $"Window=({Format(windowLocation.X)}, {Format(windowLocation.Y)}) " +
            $"Screen=({Format(screenLocation.X)}, {Format(screenLocation.Y)}) " +
            $"modifier={modifier} " +
            $"buttons={buttons} " +
            $"button={button} " +
            $"Wheel=(x:{Format(scrollX)}, y:{Format(scrollY)}, z:{Format(scrollZ)})";

        Debug.WriteLine(log);
    }
}

Xamarin.Macで、NSViewのサイズが変更された時に通知を受け取る

Xamarin.MacでNSViewのサイズが変更された時に通知を受け取るサンプルアプリケーションです。

サイズが変更された時、現在のサイズを表示します。

ソースコードはこちら

NSView.Notifications.ObserveFrameChanged()で、NSViewのサイズが変更された時に実行する処理を登録します。

次のコードでは、OnFrameChangedイベントを実行しています。

public partial class MainView : NSView
{
    public event EventHandler OnFrameChagned;

    public MainView(IntPtr handle) : base(handle)
    {
        NSView.Notifications.ObserveFrameChanged(
            (sender, e) => OnFrameChagned?.Invoke(this, EventArgs.Empty));
    }
}

ViewControllerでは、OnFrameChagnedイベントでPrintFrameSize()メソッドを実行してNSViewのサイズを表示します。

public partial class ViewController : NSViewController
{
    public override void ViewDidLoad()
    {
        base.ViewDidLoad();

        // Do any additional setup after loading the view.
        (MainView as MainView).OnFrameChagned += (sender, e) => PrintFrameSize();
    }

Xamarin.Macで、NSViewに文字列を描画する

NSViewに文字列を描画するサンプルアプリケーションです。

ソースコードはこちら

NSViewのDrawRect()メソッドで、NSMutableAttributedString()に描画する文字の設定を行い、DrawAtPoint()で描画する座標を指定します。

public partial class MyView : NSView
{
    public override void DrawRect(CoreGraphics.CGRect dirtyRect)
    {
        NSMutableAttributedString attributes = new NSMutableAttributedString("Hello, World.");
        attributes.AddAttribute(NSStringAttributeKey.Font, NSFont.FromFontName("Helvetica", 96), new NSRange(0, 13));
        attributes.AddAttribute(NSStringAttributeKey.ForegroundColor, NSColor.Brown, new NSRange(0, 13));
        attributes.DrawAtPoint(new CoreGraphics.CGPoint(0, 0));
    }
}

コードでオートレイアウトの設定をするサンプルアプリケーション

Xamarin.MACで、コードでオートレイアウトの設定をするサンプルアプリケーションです。

オートレイアウトを解除します。

greenView.TranslatesAutoresizingMaskIntoConstraints = false;

制約を設定するViewとViewの名前を設定します。
ここでは、blueViewに対して、”blueView”という名前をつけています。

var viewsDictionary = NSDictionary.FromObjectsAndKeys(
    new NSObject[] { blueView },
    new NSObject[] { new NSString("blueView") }
);

変数名と変数の値を設定します。
ここでは、leftPaddingの値を0、rightPaddingの値を30にしています。

var metricsDic = NSDictionary.FromObjectsAndKeys(
    new NSObject[] { new NSNumber(0), new NSNumber(30), },
    new NSObject[] { new NSString("leftPadding"), new NSString("rightPadding") }
);

制約を追加します。

mainView.AddConstraints(NSLayoutConstraint.FromVisualFormat(
    "H:|-leftPadding-[blueView]-rightPadding-|", 0, metricsDic, viewsDictionary));

blueViewはviewsDictionaryで設定したViewの名前、
leftPaddingとrightPaddingはmetricsDicで設定した変数名です。

Xamarin.MacでNSScrollViewのコンテンツを中央に表示するサンプルアプリケーション

NSScrollViewのコンテンツを中央に表示するサンプルアプリケーションです。

ソースコードはこちら。

下記のプロジェクトをXamarin.Macに移植しました。

NSClipViewのConstrainBoundsRect()でClipViewの範囲を制限することで、DocumentViewを中央に描画します。

public partial class MyClipView : AppKit.NSClipView
{
    public override CoreGraphics.CGRect ConstrainBoundsRect(CoreGraphics.CGRect proposedBounds)
    {
        var documentBounds = this.DocumentView.Bounds;
        var delta = new CGPoint(
            documentBounds.Width - proposedBounds.Width,
            documentBounds.Height - proposedBounds.Height);
        var x = (delta.X < 0) ? (delta.X / 2) : Math.Max(0, Math.Min(proposedBounds.X, delta.X));
        var y = (delta.Y < 0) ? (delta.Y / 2) : Math.Max(0, Math.Min(proposedBounds.Y, delta.Y));
        proposedBounds.X = (System.nfloat)x;
        proposedBounds.Y = (System.nfloat)y;
        return proposedBounds;
    }
}