「ポップアップメニューでファイル選択」の版間の差分
ナビゲーションに移動
検索に移動
インデントの追加 |
SyntaxHighlightにcopyの追加 |
||
| (同じ利用者による、間の3版が非表示) | |||
| 5行目: | 5行目: | ||
== ソースコード == | == ソースコード == | ||
<syntaxhighlight lang="javascript"> | <syntaxhighlight lang="javascript" copy> | ||
#title="ポップアップメニューでファイル選択" | #title = "ポップアップメニューでファイル選択" | ||
// MyFileSelector.js | // MyFileSelector.js | ||
// ネットワーク環境での動作確認はしていません。 | // ネットワーク環境での動作確認はしていません。 | ||
// ショートカットは>、フォルダとドライブは└ が頭につきます。 | // ショートカットは>、フォルダとドライブは└ が頭につきます。 | ||
// 関数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 = | 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()); | ||
} | } | ||
| 52行目: | 51行目: | ||
}; | }; | ||
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 ){ | if (this.index > 0) { | ||
menu.Add( "( 先頭へ )" , 5, 0 ); | menu.Add("( 先頭へ )", 5, 0); | ||
} | } | ||
break; | 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(); | ||
} | } | ||
| 103行目: | 102行目: | ||
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; | this.index = 0; | ||
break; | break; | ||
default : | default: | ||
var item = ( isLnk( this.lists[ r ] ) )? lnk2entity( this.lists[ r ] ) : this.lists[ r ]; | var item = (isLnk(this.lists[r])) ? lnk2entity(this.lists[r]) : this.lists[r]; | ||
if ( isFile( item ) ){ // ファイル | if (isFile(item)) { // ファイル | ||
this.selected = item; | this.selected = item; | ||
} else if ( isFolder( item ) || isDrive( item ) ){ // フォルダ、ドライブ | } else if (isFolder(item) || isDrive(item)) { // フォルダ、ドライブ | ||
this.index = 0; | this.index = 0; | ||
this.myfolder = new MyFolderObj( item.Path ); | this.myfolder = new MyFolderObj(item.Path); | ||
this.lists = this.myfolder.files.slice(); | this.lists = this.myfolder.files.slice(); | ||
} | } | ||
| 128行目: | 127行目: | ||
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; | ||
| 144行目: | 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 ){ | if (x.IsReady) { | ||
dary.push( x.RootFolder ); | dary.push(x.RootFolder); | ||
} | } | ||
} | } | ||
| 159行目: | 158行目: | ||
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 { | ||
| 172行目: | 171行目: | ||
} | } | ||
} | } | ||
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 ){ | if (obj == undefined) { | ||
return false; | return false; | ||
} | } | ||
var objFso = new ActiveXObject( "Scripting.FileSystemObject" ); | var objFso = new ActiveXObject("Scripting.FileSystemObject"); | ||
var result = objFso.DriveExists( obj.path ); | var result = objFso.DriveExists(obj.path); | ||
objFso = null; | objFso = null; | ||
return result; | return result; | ||
| 204行目: | 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(); | ||
} | } | ||
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);
スポンサーリンク