「ポップアップメニューでファイル選択」の版間の差分

提供: MeryWiki
ナビゲーションに移動 検索に移動
MSY-07 (トーク | 投稿記録)
スペースからタブに変更
MSY-07 (トーク | 投稿記録)
SyntaxHighlightにcopyの追加
 
(同じ利用者による、間の5版が非表示)
5行目: 5行目:


== ソースコード ==
== ソースコード ==
<syntaxhighlight lang="javascript">
<syntaxhighlight lang="javascript" copy>
#title="ポップアップメニューでファイル選択"
#title = "ポップアップメニューでファイル選択"
// MyFileSelector.js
// MyFileSelector.js
// ネットワーク環境での動作確認はしていません。
// ネットワーク環境での動作確認はしていません。
// 2013-02-24


// ショートカットは>、フォルダとドライブは└ が頭につきます。
// ショートカットは>、フォルダとドライブは└ が頭につきます。
// 関数objNameで指定しています。
// 関数objNameで指定しています。


MyFolderObj = function(){
MyFolderObj = function() {
this.initialize.apply( this, arguments );
this.initialize.apply(this, arguments);
}
};
MyFolderObj.prototype = {
MyFolderObj.prototype = {
files : "ファイルとサブフォルダのオブジェクトの配列",
files: "ファイルとサブフォルダのオブジェクトの配列",
isrootfolder : "ルートフォルダのときture",
isrootfolder: "ルートフォルダのときture",
parentfolder : "親フォルダのpath",
parentfolder: "親フォルダのpath",
initialize : function( foldername ){
initialize: function(foldername) {
var objFso = new ActiveXObject( "Scripting.FileSystemObject" );
var objFso = new ActiveXObject("Scripting.FileSystemObject");
if ( foldername == undefined || foldername.length == 0 || !objFso.FolderExists( foldername ) ){
if (foldername == undefined || foldername.length == 0 || !objFso.FolderExists(foldername)) {
var f = objFso.GetFolder( "." );
var f = objFso.GetFolder(".");
} else {
} else {
var f = objFso.GetFolder( foldername );
var f = objFso.GetFolder(foldername);
}
}
this.isrootfolder = f.IsRootFolder;
this.isrootfolder = f.IsRootFolder;
if ( f.IsRootFolder ){
if (f.IsRootFolder) {
this.parentfolder = f.path;
this.parentfolder = f.path;
// this.parentfolder = null;
// this.parentfolder = null;
35行目: 34行目:
this.parentfolder = f.parentfolder.path;
this.parentfolder = f.parentfolder.path;
}
}
var files = new Array();
var files = [];


// ファイル → サブフォルダ の順で表示。
// ファイル → サブフォルダ の順で表示。
var fc = new Enumerator( f.files );
var fc = new Enumerator(f.files);
for ( ; !fc.atEnd(); fc.moveNext() ){
for (; !fc.atEnd(); fc.moveNext()) {
files.push( fc.item() );
files.push(fc.item());
}
}
var sfc = new Enumerator( f.SubFolders );
var sfc = new Enumerator(f.SubFolders);
for ( ; !sfc.atEnd(); sfc.moveNext() ){
for (; !sfc.atEnd(); sfc.moveNext()) {
files.push( sfc.item() );
files.push(sfc.item());
}
}


50行目: 49行目:
objFso = null;
objFso = null;
}
}
}
};


MyFileSelector = function(){
MyFileSelector = function() {
this.initialize.apply( this, arguments );
this.initialize.apply(this, arguments);
}
};
MyFileSelector.prototype = {
MyFileSelector.prototype = {
myfolder : "MyFolderObj",
myfolder: "MyFolderObj",
lists : "表示するオブジェクトの配列",
lists: "表示するオブジェクトの配列",
index : "表示の起点",
index: "表示の起点",
selected : "選択されたファイル",
selected: "選択されたファイル",
offset : "popupMenuのオフセット(固定メニュー数上限)",
offset: "popupMenuのオフセット(固定メニュー数上限)",
menusize : "ポップアップメニューのファイル等の表示件数",
menusize: "ポップアップメニューのファイル等の表示件数",
initialize : function( foldername, menusize ){
initialize: function(foldername, menusize) {
this.myfolder = new MyFolderObj( foldername );
this.myfolder = new MyFolderObj(foldername);
this.lists = this.myfolder.files.slice();
this.lists = this.myfolder.files.slice();
this.index = 0;
this.index = 0;
this.selected = "";
this.selected = "";
this.offset = 9;
this.offset = 9;
this.menusize = ( arguments.length < 2 || menusize < 1 )? 20 : menusize;
this.menusize = (arguments.length < 2 || menusize < 1) ? 20 : menusize;
},
},
selectFile : function(){
selectFile: function() {
var menu = CreatePopupMenu();
var menu = CreatePopupMenu();
menu.Add( "上のフォルダー", 1, ( ( isDrive( this.lists[ 0 ] ) )? meMenuGrayed : 0 ) );
menu.Add("上のフォルダー", 1, ((isDrive(this.lists[0])) ? meMenuGrayed : 0));
menu.Add( "次ページ", 2, ( ( this.index + menusize > this.lists.length )? meMenuGrayed: 0 ) );
menu.Add("次ページ", 2, ((this.index + menusize > this.lists.length) ? meMenuGrayed : 0));
menu.Add( "前ページ", 3, ( ( this.index > 0 )? 0 : meMenuGrayed ) );
menu.Add("前ページ", 3, ((this.index > 0) ? 0 : meMenuGrayed));
menu.Add( "最後へ", 4, ( ( this.index + menusize > this.lists.length )? meMenuGrayed: 0 ) );
menu.Add("最後へ", 4, ((this.index + menusize > this.lists.length) ? meMenuGrayed : 0));
menu.Add( "-------", 0, meMenuSeparator )
menu.Add("-------", 0, meMenuSeparator);
for ( var i = this.index; i < this.index + this.menusize; i++ ){
for (var i = this.index; i < this.index + this.menusize; i++) {
if ( i < this.lists.length ){
if (i < this.lists.length) {
menu.Add( objName( this.lists[ i ] ) , i + this.offset, 0 );
menu.Add(objName(this.lists[i]), i + this.offset, 0);
}else{
} else {
if ( this.index > 0 ){ menu.Add( "( 先頭へ )" , 5, 0 ); }
if (this.index > 0) {
break
menu.Add("( 先頭へ )", 5, 0);
}
break;
}
}
}
}
var r = ( menu.Track( 0 ) - this.offset );
var r = (menu.Track(0) - this.offset);


switch( r ){
switch (r) {
case 0 - this.offset : // 選択せず
case 0 - this.offset: // 選択せず
Quit();
Quit();
case 1 - this.offset : // 上のフォルダー
case 1 - this.offset: // 上のフォルダー
this.index = 0;
this.index = 0;
if ( this.myfolder.isrootfolder ){
if (this.myfolder.isrootfolder) {
this.lists = getDriveList().slice();
this.lists = getDriveList().slice();
} else {
} else {
this.myfolder = new MyFolderObj( this.myfolder.parentfolder );
this.myfolder = new MyFolderObj(this.myfolder.parentfolder);
this.lists = this.myfolder.files.slice();
this.lists = this.myfolder.files.slice();
}
}
break;
break;
case 2 - this.offset: // 次頁
case 2 - this.offset: // 次頁
var x = this.index + this.menusize
var x = this.index + this.menusize;
this.index = ( x < this.lists.length )? x : this.index;
this.index = (x < this.lists.length) ? x : this.index;
break;
break;
 
case 3 - this.offset : // 前頁
case 3 - this.offset: // 前頁
var x = this.index - this.menusize
var x = this.index - this.menusize;
this.index = ( x < 0 )? 0 : x;
this.index = (x < 0) ? 0 : x;
break;
break;
case 4 - this.offset : // 最後の頁
case 4 - this.offset: // 最後の頁
this.index = ( this.lists.length == 0 )? 0 : Math.floor( ( this.lists.length - 1 ) / this.menusize ) * this.menusize;
this.index = (this.lists.length == 0) ? 0 : Math.floor((this.lists.length - 1) / this.menusize) * this.menusize;
break;
break;
case 5 - this.offset : // 先頭へ
case 5 - this.offset: // 先頭へ
this.index = 0;
break;
default :
var item = ( isLnk( this.lists[ r ] ) )? lnk2entity( this.lists[ r ] ) : this.lists[ r ];
if ( isFile( item ) ){ // ファイル
this.selected = item;
} else if ( isFolder( item ) || isDrive( item ) ){ // フォルダ、ドライブ
this.index = 0;
this.index = 0;
this.myfolder = new MyFolderObj( item.Path );
break;
this.lists = this.myfolder.files.slice();
default:
}
var item = (isLnk(this.lists[r])) ? lnk2entity(this.lists[r]) : this.lists[r];
if (isFile(item)) { // ファイル
this.selected = item;
} else if (isFolder(item) || isDrive(item)) { // フォルダ、ドライブ
this.index = 0;
this.myfolder = new MyFolderObj(item.Path);
this.lists = this.myfolder.files.slice();
}
}
}
return this.selected;
return this.selected;


function lnk2entity( obj ){
function lnk2entity(obj) {
// ショートカットの指すファイル(またはフォルダ)オブジェクトを返す。
// ショートカットの指すファイル(またはフォルダ)オブジェクトを返す。
var WshShell = new ActiveXObject( "WScript.Shell" );
var WshShell = new ActiveXObject("WScript.Shell");
var selectedPath = WshShell.CreateShortcut( obj.Path ).TargetPath ;
var selectedPath = WshShell.CreateShortcut(obj.Path).TargetPath;
var result = null;
var result = null;
var objFso = new ActiveXObject( "Scripting.FileSystemObject" );
var objFso = new ActiveXObject("Scripting.FileSystemObject");
if ( objFso.FileExists( selectedPath ) ){
if (objFso.FileExists(selectedPath)) {
result = objFso.GetFile( selectedPath )
result = objFso.GetFile(selectedPath);
} else if ( objFso.FolderExists( selectedPath ) ){
} else if (objFso.FolderExists(selectedPath)) {
result = objFso.GetFolder( selectedPath )
result = objFso.GetFolder(selectedPath);
}
}
WshShell = null;
WshShell = null;
142行目: 143行目:
return result;
return result;
}
}
function getDriveList(){
function getDriveList() {
// 有効なDriveオブジェクトのルートフォルダをフォルダオブジェクトの配列で返す。
// 有効なDriveオブジェクトのルートフォルダをフォルダオブジェクトの配列で返す。
var fso, n, e, x;
var fso, n, e, x;
var dary = [];
var dary = [];
var objFso = new ActiveXObject( "Scripting.FileSystemObject" );
var objFso = new ActiveXObject("Scripting.FileSystemObject");
e = new Enumerator( objFso.Drives );
e = new Enumerator(objFso.Drives);
for ( ; !e.atEnd(); e.moveNext() ){
for (; !e.atEnd(); e.moveNext()) {
x = e.item();
x = e.item();
if ( x.IsReady ){ dary.push( x.RootFolder ); }
if (x.IsReady) {
dary.push(x.RootFolder);
}
}
}
objFso = null;
objFso = null;
return dary;
return dary;
}
}
function objName( obj ){
function objName(obj) {
// ポップアップメニュー用に各オブジェクトの名前等を返す。
// ポップアップメニュー用に各オブジェクトの名前等を返す。
if ( isLnk( obj ) ){            // ショートカット
if (isLnk(obj)) {            // ショートカット
return "> " + obj.Name;
return "> " + obj.Name;
} else if ( isFile( obj ) ){    // ファイル
} else if (isFile(obj)) {    // ファイル
return obj.Name;
return obj.Name;
} else if ( isFolder( obj ) ){  // フォルダー, ディスク
} else if (isFolder(obj)) {  // フォルダー, ディスク
var str = ( obj.Name == "" )? obj.Path : obj.Name;
var str = (obj.Name == "") ? obj.Path : obj.Name;
return "└ " + str;
return "└ " + str;
} else {
} else {
return "objName?"
return "objName?";
}
}
}
}
function isLnk( obj ){
function isLnk(obj) {
return obj.type == "ショートカット";
return obj.type == "ショートカット";
}
}
function isFile( obj ){
function isFile(obj) {
var objFso = new ActiveXObject( "Scripting.FileSystemObject" );
var objFso = new ActiveXObject("Scripting.FileSystemObject");
var result = objFso.FileExists( obj.path );
var result = objFso.FileExists(obj.path);
objFso = null;
objFso = null;
return result;
return result;
}
}
function isFolder( obj ){
function isFolder(obj) {
var objFso = new ActiveXObject( "Scripting.FileSystemObject" );
var objFso = new ActiveXObject("Scripting.FileSystemObject");
var result = objFso.FolderExists( obj.path );
var result = objFso.FolderExists(obj.path);
objFso = null;
objFso = null;
return result;
return result;
}
}
function isDrive( obj ){
function isDrive(obj) {
if ( obj == undefined ){ return false };
if (obj == undefined) {
var objFso = new ActiveXObject( "Scripting.FileSystemObject" );
return false;
var result = objFso.DriveExists( obj.path );
}
var objFso = new ActiveXObject("Scripting.FileSystemObject");
var result = objFso.DriveExists(obj.path);
objFso = null;
objFso = null;
return result;
return result;
}
}
}
}
}
};




198行目: 203行目:
menusize = 25;
menusize = 25;
// 引数ナシでも動作します。
// 引数ナシでも動作します。
var myfileselector = new MyFileSelector( path, menusize );
var myfileselector = new MyFileSelector(path, menusize);
var selected = "";
var selected = "";
while ( selected == "" ){
while (selected == "") {
selected = myfileselector.selectFile();
selected = myfileselector.selectFile();
}
}


Alert( selected.Path );
editor.OpenFile(selected.Path, meEncodingNone, meOpenAllowNewWindow);
</syntaxhighlight>
</syntaxhighlight>

2025年6月30日 (月) 00:20時点における最新版

概要[編集]

ポップアップメニューでファイルを選択することができます。

詳細はポップアップメニューでファイル選択.jsについてを参照してください。

ソースコード[編集]

#title = "ポップアップメニューでファイル選択"
// MyFileSelector.js
// ネットワーク環境での動作確認はしていません。

// ショートカットは>、フォルダとドライブは└ が頭につきます。
// 関数objNameで指定しています。

MyFolderObj = function() {
	this.initialize.apply(this, arguments);
};
MyFolderObj.prototype = {
	files: "ファイルとサブフォルダのオブジェクトの配列",
	isrootfolder: "ルートフォルダのときture",
	parentfolder: "親フォルダのpath",
	initialize: function(foldername) {
		var objFso = new ActiveXObject("Scripting.FileSystemObject");
		if (foldername == undefined || foldername.length == 0 || !objFso.FolderExists(foldername)) {
			var f = objFso.GetFolder(".");
		} else {
			var f = objFso.GetFolder(foldername);
		}
		this.isrootfolder = f.IsRootFolder;
		if (f.IsRootFolder) {
			this.parentfolder = f.path;
//			this.parentfolder = null;
		} else {
			this.parentfolder = f.parentfolder.path;
		}
		var files = [];

		// ファイル → サブフォルダ の順で表示。
		var fc = new Enumerator(f.files);
		for (; !fc.atEnd(); fc.moveNext()) {
			files.push(fc.item());
		}
		var sfc = new Enumerator(f.SubFolders);
		for (; !sfc.atEnd(); sfc.moveNext()) {
			files.push(sfc.item());
		}

		this.files = files;
		objFso = null;
	}
};

MyFileSelector = function() {
	this.initialize.apply(this, arguments);
};
MyFileSelector.prototype = {
	myfolder: "MyFolderObj",
	lists: "表示するオブジェクトの配列",
	index: "表示の起点",
	selected: "選択されたファイル",
	offset: "popupMenuのオフセット(固定メニュー数上限)",
	menusize: "ポップアップメニューのファイル等の表示件数",
	initialize: function(foldername, menusize) {
		this.myfolder = new MyFolderObj(foldername);
		this.lists = this.myfolder.files.slice();
		this.index = 0;
		this.selected = "";
		this.offset = 9;
		this.menusize = (arguments.length < 2 || menusize < 1) ? 20 : menusize;
	},
	selectFile: function() {
		var menu = CreatePopupMenu();
		menu.Add("上のフォルダー", 1, ((isDrive(this.lists[0])) ? meMenuGrayed : 0));
		menu.Add("次ページ", 2, ((this.index + menusize > this.lists.length) ? meMenuGrayed : 0));
		menu.Add("前ページ", 3, ((this.index > 0) ? 0 : meMenuGrayed));
		menu.Add("最後へ", 4, ((this.index + menusize > this.lists.length) ? meMenuGrayed : 0));
		menu.Add("-------", 0, meMenuSeparator);
		for (var i = this.index; i < this.index + this.menusize; i++) {
			if (i < this.lists.length) {
				menu.Add(objName(this.lists[i]), i + this.offset, 0);
			} else {
				if (this.index > 0) {
					menu.Add("( 先頭へ )", 5, 0);
				}
				break;
			}
		}
		var r = (menu.Track(0) - this.offset);

		switch (r) {
			case 0 - this.offset: // 選択せず
				Quit();
			case 1 - this.offset: // 上のフォルダー
				this.index = 0;
				if (this.myfolder.isrootfolder) {
					this.lists = getDriveList().slice();
				} else {
					this.myfolder = new MyFolderObj(this.myfolder.parentfolder);
					this.lists = this.myfolder.files.slice();
				}
				break;
			case 2 - this.offset: // 次頁
				var x = this.index + this.menusize;
				this.index = (x < this.lists.length) ? x : this.index;
				break;

			case 3 - this.offset: // 前頁
				var x = this.index - this.menusize;
				this.index = (x < 0) ? 0 : x;
				break;
			case 4 - this.offset: // 最後の頁
				this.index = (this.lists.length == 0) ? 0 : Math.floor((this.lists.length - 1) / this.menusize) * this.menusize;
				break;
			case 5 - this.offset: // 先頭へ
				this.index = 0;
				break;
			default:
				var item = (isLnk(this.lists[r])) ? lnk2entity(this.lists[r]) : this.lists[r];
				if (isFile(item)) { // ファイル
					this.selected = item;
				} else if (isFolder(item) || isDrive(item)) { // フォルダ、ドライブ
					this.index = 0;
					this.myfolder = new MyFolderObj(item.Path);
					this.lists = this.myfolder.files.slice();
				}
		}
		return this.selected;

		function lnk2entity(obj) {
			// ショートカットの指すファイル(またはフォルダ)オブジェクトを返す。
			var WshShell = new ActiveXObject("WScript.Shell");
			var selectedPath = WshShell.CreateShortcut(obj.Path).TargetPath;
			var result = null;
			var objFso = new ActiveXObject("Scripting.FileSystemObject");
			if (objFso.FileExists(selectedPath)) {
				result = objFso.GetFile(selectedPath);
			} else if (objFso.FolderExists(selectedPath)) {
				result = objFso.GetFolder(selectedPath);
			}
			WshShell = null;
			selectedPath = null;
			objFso = null;
			return result;
		}
		function getDriveList() {
			// 有効なDriveオブジェクトのルートフォルダをフォルダオブジェクトの配列で返す。
			var fso, n, e, x;
			var dary = [];
			var objFso = new ActiveXObject("Scripting.FileSystemObject");
			e = new Enumerator(objFso.Drives);
			for (; !e.atEnd(); e.moveNext()) {
				x = e.item();
				if (x.IsReady) {
					dary.push(x.RootFolder);
				}
			}
			objFso = null;
			return dary;
		}
		function objName(obj) {
			// ポップアップメニュー用に各オブジェクトの名前等を返す。
			if (isLnk(obj)) {            // ショートカット
				return "> " + obj.Name;
			} else if (isFile(obj)) {    // ファイル
				return obj.Name;
			} else if (isFolder(obj)) {  // フォルダー, ディスク
				var str = (obj.Name == "") ? obj.Path : obj.Name;
				return "└ " + str;
			} else {
				return "objName?";
			}
		}
		function isLnk(obj) {
			return obj.type == "ショートカット";
		}
		function isFile(obj) {
			var objFso = new ActiveXObject("Scripting.FileSystemObject");
			var result = objFso.FileExists(obj.path);
			objFso = null;
			return result;
		}
		function isFolder(obj) {
			var objFso = new ActiveXObject("Scripting.FileSystemObject");
			var result = objFso.FolderExists(obj.path);
			objFso = null;
			return result;
		}
		function isDrive(obj) {
			if (obj == undefined) {
				return false;
			}
			var objFso = new ActiveXObject("Scripting.FileSystemObject");
			var result = objFso.DriveExists(obj.path);
			objFso = null;
			return result;
		}
	}
};


// ----------
path = document.path;
menusize = 25;
// 引数ナシでも動作します。
var myfileselector = new MyFileSelector(path, menusize);
var selected = "";
while (selected == "") {
	selected = myfileselector.selectFile();
}

editor.OpenFile(selected.Path, meEncodingNone, meOpenAllowNewWindow);
スポンサーリンク