// // Inspector.msl - オブジェクト内部の表示メソッドを追加する。 // Copyright 2004 Anchor Systems Corporation // $Id: Inspector.msl,v 1.3 2004/07/13 09:00:30 monnai Exp $ // //【使い方】 // このライブラリファイルを Startup.ms などからインクルートしておくと、 // Object.inspace() メソッドが追加されます。任意のオブジェクトに対して // このメソッドを呼び出すと、そのオブジェクトのプロパティを表示する // ダイアログボックスが表示されます。デバッグなどでお使いください。 // // anObject.inspect(true) として呼び出すと、__proto__ などシステムで // 定義されているプロパティも表示します。false を渡すか省略すると、 // ユーザ定義のプロパティのみが表示されます。 // //【テスト】 // 以下の各行を選択&実行すると、インスペクタのテストができます。 // // global.inspect(); // global.inspect(true); // Inspector([1, 2, 3]); // [1,2,3,,"X"].inspect() // ({ x: 100, y: 200, x: [1,2,3] }).inspect(true); // //【動作確認バージョン】 // Peggy、Peggy Pro、Peggy Pro for Oracle 4.20 以上。 // //【使用条件】 // このMocaScriptライブラリは、誰でも無償で利用できます。 // //【保証】 // このライブラリを使った結果に対してアンカーシステムズ(株)は如何なる責任 // も負うものではありません。あくまでも利用される方の判断と責任においてご // 利用ください。 // ///////////////////////////////////////////////////////////////////////////// // Inspector Object.prototype.inspect = function(all) { Inspector([ this ], all); }; global.Inspector = Inspector; function Inspector(data, all) { var header = [ [ "Name", 180 ], [ "Type", 77 ], [ "Value", 160 ] ]; var roots = [ ]; var count = 0; for (var i = 0; i < data.length; i++) { var val = data[i]; var type = typeof val; var item = [ "", type, String(val) ]; if (type == "string") item[2] = Inspector.quote(item[2]); else if (type == "object" || type == "function") { var proto = val.__proto__; if (proto && proto.constructor) item[1] = String(proto.constructor).substr(9); item.children = Inspector.expand; item.object = val; item.all = all; item.name = "root" + count++; } roots.push(item); } var template = [ { type: "TREELIST", name: "TL", width: 250, height: 249, header: header, value: roots } ]; var dialog = new Dialog("Object Inspector", template); dialog.addOkCancel = Dialog.ADD_OK | Dialog.ADD_LINE; dialog.count = count; dialog.onOpen = function() { // 最初のルートだけ開いておく(いちいち開かなくのは面倒)。 if (this.count > 0) this.expandItem("TL", 2, "root0"); }; dialog.open(); } Inspector.expand = function(dialog, control, parent) { var children = [ ]; var object = parent.object; var i, keys, key, val, type, item, proto; if (object.__proto__ === Array.prototype) { // 配列は、まず数値インデックスの要素を並べる。 for (i in object) { val = object[i]; type = typeof val; item = [ i, type, String(val) ]; if (type == "string") { item[2] = Inspector.quote(item[2]); } else if (type == "object" || type == "function") { proto = val.__proto__; if (proto && proto.constructor) item[1] = String(proto.constructor).substr(9); item.children = Inspector.expand; item.object = val; item.all = parent.all; } children.push(item); } // 配列のエレメントだけ表示するときは、せめて長さも表示する。 if (!parent.all) children.push([ "length", "integer", object.length ]); } keys = enumKeys(object, parent.all); keys.sort(String.stricmp); for (i = 0; i < keys.length; i++) { key = keys[i]; val = object[key]; type = typeof val; item = [ key, type, String(val) ]; if (type == "string") { item[2] = Inspector.quote(item[2]); } else if (type == "object" || type == "function") { proto = val.__proto__; if (proto && proto.constructor) item[1] = String(proto.constructor).substr(9); item.children = Inspector.expand; item.object = val; item.all = parent.all; } children.push(item); } return children; }; Inspector.quote = function(str) { return '"' + str.replace(/[\\"]/g, function($0) { return "\\" + $0; }) + '"'; };