「すべて閉じる」の版間の差分
むだなコードの残滓を削除。ZIP を更新 |
空行と改行の除去 |
||
| (2人の利用者による、間の9版が非表示) | |||
| 1行目: | 1行目: | ||
いっぺんに複数のタブを閉じます。 | いっぺんに複数のタブを閉じます。 | ||
* | *途中で「保存の確認」ダイアログを表示するタイプと表示しないタイプがあります。 | ||
※「保存の確認」ダイアログで「キャンセル」ボタンを押した場合、そのタブは閉じず、他のタブにたいしては「すべて閉じる」の処理を継続します。 | |||
< | <div style="float:right">__TOC__</div> | ||
== ダウンロード == | == ダウンロード == | ||
[[ファイル:すべて閉じるマクロ集.zip]] | ;[[ファイル:すべて閉じるマクロ集.zip]] | ||
(最終更新: 2019/05/03)<br> | |||
マクロ×8本、アイコン入り | |||
*2019/04/25② sukemaru | |||
:[[#「すべて閉じる」の統合版(モード選択)|統合版]] を追加。 | |||
:アイコンのデザインをちょっと変更。 | |||
*2019/05/03 sukemaru | |||
:途中で「保存の確認」ダイアログが出て「キャンセル」した場合に、元のタブをアクティブにするように変更。 | |||
:アイコンのデザインをもうちょっと変更。 | |||
:[[#「すべて閉じる」の統合版(include版)|include版]] を追加。 | |||
== すべて閉じる == | == すべて閉じる == | ||
ウインドウを閉じるさいに、保存していないタブにたいして「 **** への変更を保存しますか?」の確認ダイアログを表示させずに終了できます。<br> | |||
※基本的に、「未保存*」の名前つきタブがあるときは、保存の確認ダイアログを表示します。 | |||
* | *「未保存*」以外のタブ(変更マーク「*」がないタブ)をすべて閉じるなら、別ページに「[[変更なしのタブをすべて閉じる]]」マクロがあります。 | ||
*「無題」をふくめたすべての「未保存*」のタブについて保存処理や確認ダイアログが必要であれば、[[ヘルプ:ファイル#すべて保存して閉じる|ファイルメニュー]]の「すべて保存して閉じる」や「すべて閉じる」を使用してください。 | |||
ファイルメニューの「'''すべて閉じる''' (Shift+Alt+X)」の [[マクロリファレンス:Window インターフェイス#Close メソッド|マクロコード]] | |||
<syntaxhighlight lang="javascript"> | |||
// すべてのエディタウインドウを閉じる | |||
editor.ExecuteCommandByID( MEID_FILE_CLOSE_ALL = 2097 ); | |||
// アクティブウインドウだけ閉じるなら | |||
// window.Close(); | |||
</syntaxhighlight> | |||
ファイルメニューの「'''すべて保存して閉じる''' (Shift+Ctrl+E)」の [[マクロリファレンス:Editor インターフェイス#SaveCloseAll メソッド|マクロコード]] | |||
<syntaxhighlight lang="javascript"> | |||
// すべてのエディタウインドウを閉じる(未保存のタブは保存する) | |||
editor.SaveCloseAll(); | |||
</syntaxhighlight> | |||
=== 保存の確認をせずに閉じる === | === 保存の確認をせずに閉じる === | ||
すべての「未保存*」タブについて、いっさい保存の確認をせずに閉じます。 <br> | |||
※ | ※<b style="color:#c00;">問答無用</b>でエディタウインドウが閉じるので、ご利用は自己責任で。 | ||
< | <syntaxhighlight lang="javascript"> | ||
#title = "すべて閉じる(保存の確認なし)" | #title = "すべて閉じる(保存の確認なし)" | ||
#tooltip = " | #tooltip = "未保存のタブがあっても保存の確認をせずに終了する" | ||
#icon = "close_all[2].ico" | |||
for ( var i = 0; i < editor.Documents.Count; i ++ ) { | for ( var i = 0; i < editor.Documents.Count; i ++ ) { | ||
| 29行目: | 52行目: | ||
} | } | ||
window.Close(); | window.Close(); | ||
</ | </syntaxhighlight> | ||
=== 保存の確認ダイログを出す === | === 保存の確認ダイログを出す === | ||
名前のある(実体ファイルのある)「未保存*」のタブにたいしては、保存の確認ダイログを表示します。<br> | |||
※「無題」のタブにたいしては、保存の確認をしません。 | |||
< | <syntaxhighlight lang="javascript"> | ||
#title = "すべて閉じる(無題は保存の確認しない)" | #title = "すべて閉じる(無題は保存の確認しない)" | ||
#tooltip = " | #tooltip = "無題のタブは保存の確認をせずに終了する" | ||
#icon = "close_all[1].ico" | |||
for ( var i = 0; i < editor.Documents.Count; i ++ ) { | for ( var i = 0; i < editor.Documents.Count; i ++ ) { | ||
| 47行目: | 69行目: | ||
} | } | ||
window.Close(); | window.Close(); | ||
</ | </syntaxhighlight> | ||
== 他のタブを閉じる == | |||
アクティブなタブ以外を閉じます。 | |||
※「無題」のタブでも名前つきのタブでも、「未保存*」のタブについては保存の確認ダイアログを表示します。 | |||
=== 左側のタブを閉じる === | |||
<syntaxhighlight lang="javascript"> | |||
=== | #title = "左側のタブをすべて閉じる" | ||
#tooltip = "左側のタブをすべて閉じる" | |||
< | #icon = "close_left.ico" | ||
#title = " | |||
#tooltip = " | |||
var d = document; | var d = document; | ||
var dCount = editor.Documents.Count; | var dCount = editor.Documents.Count; | ||
var | var docu, hit; | ||
for ( var i = | for ( var i = dCount - 1; i >= 0; i -- ) { | ||
docu = editor.Documents.Item( i ); | docu = editor.Documents.Item( i ); | ||
if ( docu == d ) { | if ( docu == d ) { hit = 1; continue; } | ||
if ( ! hit ) { continue; } | |||
docu.Close(); | |||
} | } | ||
d.Activate(); | |||
</syntaxhighlight> | |||
</ | |||
=== 右側のタブをすべて閉じる === | |||
=== | <syntaxhighlight lang="javascript"> | ||
#title = "右側のタブをすべて閉じる" | |||
< | #tooltip = "右側のタブをすべて閉じる" | ||
#title = " | #icon = "close_right.ico" | ||
#tooltip = " | |||
var d = document; | var d = document; | ||
var dCount = editor.Documents.Count; | var dCount = editor.Documents.Count; | ||
for ( var i = dCount - 1; editor.Documents.Item( i ) != d; i -- ) { | |||
for ( var i = | editor.Documents.Item( i ).Close(); | ||
} | } | ||
</ | d.Activate(); | ||
</syntaxhighlight> | |||
=== 他のタブをすべて閉じる === | === 他のタブをすべて閉じる === | ||
<syntaxhighlight lang="javascript"> | |||
< | |||
#title = "他のタブをすべて閉じる" | #title = "他のタブをすべて閉じる" | ||
#tooltip = "他のタブをすべて閉じる" | #tooltip = "他のタブをすべて閉じる" | ||
#icon = "close_other.ico" | |||
var d = document; | var d = document; | ||
var dCount = editor.Documents.Count; | var dCount = editor.Documents.Count; | ||
var docu; | var docu; | ||
for ( var i = dCount - 1; i >= 0; i -- ) { | for ( var i = dCount - 1; i >= 0; i -- ) { | ||
docu = editor.Documents.Item( i ); | docu = editor.Documents.Item( i ); | ||
| 126行目: | 123行目: | ||
} | } | ||
} | } | ||
</ | d.Activate(); | ||
</syntaxhighlight> | |||
== 他のタブをすべて閉じる(オプションつき) == | |||
※「未保存*」のタブにたいして 保存の確認ダイログを表示するか/しないか のオプションを設定できます。<br> | |||
※設定項目で動作モードを 1 や 2 に変更して別名の .JS ファイルに保存すれば、「右側/左側のタブをすべて閉じる」マクロになります。 | |||
<syntaxhighlight lang="javascript"> | |||
< | |||
#title = "他のタブをすべて閉じる" | #title = "他のタブをすべて閉じる" | ||
#tooltip = "他のタブをすべて閉じる" | #tooltip = "他のタブをすべて閉じる" | ||
| 145行目: | 143行目: | ||
var ignoreUnNamed = false; | var ignoreUnNamed = false; | ||
// true: 「無題」ドキュメントにたいしては保存の確認ダイアログを表示しない | // true: 「無題」ドキュメントにたいしては保存の確認ダイアログを表示しない | ||
// false: 「無題」ドキュメントにたいしても保存の確認ダイアログを表示する | // false: 「無題」ドキュメントにたいしても保存の確認ダイアログを表示する | ||
| 160行目: | 158行目: | ||
} | } | ||
} | } | ||
// 他のタブをすべて閉じる | // 他のタブをすべて閉じる | ||
var start = ( closeMode == 2 ) ? dd - 1 : dCount - 1; | var start = ( closeMode == 2 ) ? dd - 1 : dCount - 1; | ||
var end = ( closeMode == 1 ) ? dd + 1 : 0; | var end = ( closeMode == 1 ) ? dd + 1 : 0; | ||
for ( var i = start; i + 1 > end; i -- ) { | for ( var i = start; i + 1 > end; i -- ) { | ||
docu = editor.Documents.Item( i ); | docu = editor.Documents.Item( i ); | ||
| 172行目: | 172行目: | ||
} | } | ||
} | } | ||
</ | d.Activate(); | ||
</syntaxhighlight> | |||
== 「すべて閉じる」の統合版(モード選択) == | |||
[[ファイル:Mery_すべて閉じる(入力).png|link=|border|right|入力ダイアログ]] | |||
[[ファイル:Mery_すべて閉じる(メニュー).png|link=|border|right|ポップアップメニュー]] | |||
「すべて閉じる」と「他のタブを閉じる」の機能 '''全部入り''' です。<br><br> | |||
※入力ダイアログかポップアップメニューで動作モードを指定します(ソースコード内の設定項目で「デフォルト値」を指定しておくと Enter または Space キーだけで処理を開始できます)。 | |||
<br clear=all> | |||
<syntaxhighlight lang="javascript" style="height:60em; overflow:auto;"> | |||
#title = "すべて閉じる(モード選択)" | |||
#tooltip = "すべて閉じる(入力ダイアログ)" | |||
#icon = "close_all[4].ico" | |||
// または #tooltip = "すべて閉じる(ポップアップメニュー)" | |||
// ---------- ▼ 設定項目 ▼ ---------- | |||
// ■起動モード | |||
var userModeInput = true; | |||
// true: 入力ダイアログ | |||
// false: ポップアップメニュー | |||
// ■デフォルト値( 1 ~ 6 ) | |||
var defaultMode = ""; | |||
// デフォルト: 入力ダイアログでは Enter キーで確定 | |||
// ポップアップメニューでは Space キーで確定 | |||
// "": 表示しない | |||
// 1: 他のタブをすべて閉じる | |||
// 2: 左側のタブをすべて閉じる | |||
// 3: 右側のタブをすべて閉じる | |||
// 4: 変更なしのタブをすべて閉じる(「未保存*」のタブは閉じない) | |||
// 5: すべてのタブを閉じる | |||
// 6: 問答無用ですべて閉じる(すべてのタブの「未保存*」を無視) | |||
// ※ 4 ですべてのタブが保存済み、かつタブの閉じるボタンを表示している場合は、 | |||
// さいごに新規「無題」タブが残る(閉じるボタン無しならウインドウが閉じる) | |||
// ※ 4, 6 以外は、「未保存*」の名前つきドキュメントで保存の確認ダイアログ | |||
// ※ 5, 6 で閉じた場合、「ワークスペース」の復元可(Mery Ver. 2.6.15 以降) | |||
// ■未保存* の「無題」ドキュメント | |||
var ignoreUnNamed = false; | |||
// true: 保存の確認ダイアログを表示しない | |||
// false: 保存の確認ダイアログを表示する | |||
// ※ mode = 6 では無効(表示しない) | |||
// ---------- ▲ 設定項目 ▲ ---------- | |||
var mode; | |||
// 入力ダイアログ | |||
if ( userModeInput ) { | |||
// (全角 0-9 のみ)半角変換した数字を文字列で返す | |||
var ToHalfWidthNum = function( strVal ){ | |||
return strVal.replace( /[0-9]/g, function( tmp ) { | |||
return String.fromCharCode( tmp.charCodeAt(0) - 0xFEE0 ) | |||
} ) }; | |||
// 1 ~ 6 以外の無効な文字列はすべて無視 | |||
mode = + ToHalfWidthNum( Prompt( "1: 他のタブ. 2: 左側. 3: 右側. 4: 変更なし. 5: すべて. 6: 強制終了.", defaultMode ) ).replace( /[^1-6]/g , "" ); | |||
} | |||
// ポップアップメニュー | |||
else { | |||
var menu = CreatePopupMenu(); | |||
menu.Add( "&1:\t他のタブをすべて閉じる", 1 ); | |||
menu.Add( "&2:\t左側のタブをすべて閉じる", 2 ); | |||
menu.Add( "&3:\t右側のタブをすべて閉じる", 3 ); | |||
menu.Add( "&4:\t変更なしのタブをすべて閉じる", 4 ); | |||
menu.Add( "&5:\tすべてのタブを閉じる", 5 ); | |||
menu.Add( "&6:\t未保存* を無視してすべて閉じる", 6 ); | |||
if ( /^[0-6]$/.test( defaultMode.toString() ) ) { | |||
menu.Add( "", 0, meMenuSeparator ); | |||
menu.Add( defaultMode + ":\tデフォルトモードを実行 ( Space& キー )", + defaultMode ); | |||
} | |||
menu.Add( "", 0, meMenuSeparator ); | |||
menu.Add( "&0:\tキャンセル", 0 ); | |||
mode = menu.Track( mePosMouse ); | |||
} | |||
var d = document; | |||
var dCount = editor.Documents.Count; | |||
var dd, docu; | |||
switch ( mode ) { | |||
// 他のタブをすべて閉じる | |||
case 1: case 2: case 3: | |||
loop: | |||
for ( var i = 0; i < dCount; i ++ ) { | |||
docu = editor.Documents.Item( i ); | |||
if ( docu == d ) { | |||
dd = i; | |||
break loop; | |||
} | |||
} | |||
var start = ( mode == 2 ) ? dd - 1 : dCount - 1; | |||
var end = ( mode == 3 ) ? dd + 1 : 0; | |||
for ( var i = start; i + 1 > end; i -- ) { | |||
docu = editor.Documents.Item( i ); | |||
if ( docu != d ) { | |||
if ( ignoreUnNamed && ! docu.Name ) { | |||
docu.Saved = true; | |||
} | |||
docu.Close(); | |||
} | |||
} | |||
d.Activate(); | |||
break; | |||
// すべて閉じる | |||
case 4: case 5: case 6: | |||
for ( var i = dCount- 1; i + 1 > 0; i -- ) { | |||
docu = editor.Documents.Item( i ); | |||
if ( mode == 4 && docu.Saved ) { | |||
docu.Close(); | |||
} | |||
else if ( mode == 6 | |||
|| ( mode == 5 && ignoreUnNamed && ! docu.Name ) ) { | |||
docu.Saved = true; | |||
} | |||
} | |||
if ( mode != 4 ) { | |||
window.Close(); | |||
} | |||
break; | |||
default: | |||
break; | |||
} | |||
</syntaxhighlight> | |||
== 「すべて閉じる」の統合版(include版) == | |||
macros フォルダに [[includeライブラリ]] を導入しているばあいは、「[[#「すべて閉じる」の統合版(モード選択)|統合版]]」の設定をポップアップメニュー内のサブメニューからから変更できるという …ただそれだけです(一応メニュー項目を少し増やしてます)。<br> | |||
興味のある方は、[[#ダウンロード|ZIP書庫]] 内の「include版」フォルダの JS ファイルをご利用ください。 | |||
※ ソースコード4行目「#include "include/IO.js"」をコメントアウトすると、ふつうの「統合版」としても使用できます。 | |||
<syntaxhighlight lang="javascript" style="height:40em; overflow:auto;"> | |||
#title = "すべて閉じる(モード選択)" | |||
#tooltip = "すべて閉じる(ポップアップメニュー)" | |||
#icon = "close_all[4].ico" | |||
#include "include/IO.js" | |||
// または #tooltip = "すべて閉じる(入力ダイアログ)" | |||
// ---------- ▼ 設定項目 ▼ ---------- | |||
// ■ 起動モード | |||
var userModeInput = false; | |||
// true: 入力ダイアログ | |||
// false: ポップアップメニュー | |||
// ■ デフォルト値( 1 ~ 6 ) | |||
var defaultMode = ""; | |||
// デフォルト: 入力ダイアログでは Enter キーで確定 | |||
// ポップアップメニューでは Space キーで確定 | |||
// "": 表示しない | |||
// 1: 他のタブをすべて閉じる | |||
// 2: 左側のタブをすべて閉じる | |||
// 3: 右側のタブをすべて閉じる | |||
// 4: 変更なしのタブをすべて閉じる(「未保存*」のタブは閉じない) | |||
// 5: すべてのタブを閉じる | |||
// 6: 問答無用ですべて閉じる(すべてのタブの「未保存*」を無視) | |||
// ▼ ポップアップメニュー専用(※「無題」タブの「未保存*」確認あり) ▼ | |||
// 7: すべて閉じる (※同一ウインドウ内の全タブ) | |||
// 8: すべて閉じる (※ファイルメニューのコマンド) | |||
// 9: すべて保存して閉じる (※ファイルメニューのコマンド) | |||
// ※ 4 ですべてのタブが保存済み、かつタブの閉じるボタンを表示している場合は、 | |||
// さいごに新規「無題」タブが残る(閉じるボタン無しならウインドウが閉じる) | |||
// ※ 4, 6 以外は、「未保存*」の名前つきドキュメントで保存の確認ダイアログ | |||
// ※ 1 ~ 7 で閉じるのは同一ウインドウ内のタブのみ | |||
// ※ 8, 9 は、すべてのエディタウインドウの全タブ | |||
// ※ 5 ~ 9 で閉じた場合、「ワークスペース」の復元可(Mery Ver. 2.6.15 以降) | |||
// ■未保存* の「無題」ドキュメント | |||
var ignoreUnNamed = false; | |||
// true: 保存の確認ダイアログを表示しない | |||
// false: 保存の確認ダイアログを表示する | |||
// ※ mode = 6 ~ 8 では ignoreUnNamed オプション無効 | |||
// ---------- ▼ 【include版】 初期設定項目 ▼ ---------- | |||
// ソースコードの4行目 #include "include/IO.js" が有効で | |||
// 起動モードがポップアップメニューの場合のみ使用可 | |||
// ◆ 「設定変更」サブメニューを表示するか? | |||
var settingEnable = true; | |||
// ◆ JSON ファイルのベース名 | |||
var jsonName = ScriptName.replace( /\.js$/i, "" ); | |||
// ---------- ▲ 設定項目 ▲ ---------- | |||
/* ▼ 【include版】の追加コード ▼ */ | |||
var setting; | |||
var initialSettings = { settingEnable: false }; | |||
if ( typeof IO == "object" && settingEnable ) { | |||
initialSettings = { | |||
settingEnable: settingEnable, | |||
userModeInput: userModeInput, | |||
defaultMode: defaultMode, | |||
ignoreUnNamed: ignoreUnNamed | |||
} | |||
setting = initialSettings; | |||
jsonName = jsonName || ScriptName.replace( /\.js$/i, "" ); | |||
setting = IO.Deserialize( setting, jsonName ); | |||
settingEnable = setting.settingEnable; | |||
// userModeInput = setting.userModeInput; | |||
defaultMode = setting.defaultMode; | |||
ignoreUnNamed = setting.ignoreUnNamed; | |||
} | |||
var mode; | |||
// 入力ダイアログ | |||
if ( userModeInput ) { | |||
// 半角変換した ascii 文字列を返す | |||
var ToHalfWidth = function( strVal ){ | |||
return strVal.replace( /[!-~]/g, function( tmp ) { | |||
return String.fromCharCode( tmp.charCodeAt(0) - 0xFEE0 ) | |||
} ) }; | |||
// 1 ~ 6 以外の無効な文字列はすべて無視 | |||
var label = "1: 他のタブ. 2: 左側. 3: 右側. 4: 変更なし. 5: すべて. 6: 強制終了."; | |||
var string = defaultMode > 6 ? "" : defaultMode; | |||
mode = ToHalfWidth( Prompt( label, string ) ).toLowerCase(); | |||
/* 【include版】の追加コード */ | |||
// ※ include 版で "js" か "open" と入力した場合は、JS ファイルを開く | |||
// または "menu" か "setting" と入力した場合は、ポップアップメニューを開く | |||
mode = ( typeof IO == "object" && initialSettings.settingEnable ) | |||
? ( mode == "js" || mode == "open" ) | |||
? 1014 | |||
: ( mode == "menu" || mode == "setting" ) | |||
? "menu" | |||
: + mode.replace( /[^1-6]/g , "" ) | |||
: + mode.replace( /[^1-6]/g , "" ); | |||
} | |||
// ポップアップメニュー | |||
if ( ! userModeInput || mode == "menu" ) { | |||
var menu = CreatePopupMenu(); | |||
/* 【include版】の設定変更サブメニュー */ | |||
if ( initialSettings.settingEnable ) { | |||
SettingsMenu( menu ); | |||
} | |||
menu.Add( "&0:\tキャンセル", 0 ); | |||
menu.Add( "", 10, meMenuSeparator ); | |||
menu.Add( "&1:\t他のタブをすべて閉じる", 1 ); | |||
menu.Add( "&2:\t左側のタブをすべて閉じる", 2 ); | |||
menu.Add( "&3:\t右側のタブをすべて閉じる", 3 ); | |||
menu.Add( "&4:\t変更なしのタブをすべて閉じる", 4 ); | |||
menu.Add( "&5:\tすべてのタブを閉じる", 5 ); | |||
menu.Add( "&6:\t未保存* の確認なしですべて閉じる", 6 ); | |||
menu.Add( "", 10, meMenuSeparator ); | |||
menu.Add( "&7:\tすべて閉じる (同一ウインドウ)", 7 ); | |||
menu.Add( "&8:\tすべて閉じる (全ウインドウ)", 8 ); | |||
menu.Add( "&9:\tすべて保存して閉じる (全ウインドウ)", 9 ); | |||
if ( /^[0-9]$/.test( defaultMode.toString() ) ) { | |||
menu.Add( "", 10, meMenuSeparator ); | |||
// デフォルトモードのラベルで表示するなら(※「キャンセル」を先頭にピンすること) | |||
menu.Add( menu.GetText( defaultMode ).replace( "&", "" ) + " ( Space& キー )", + defaultMode ); | |||
// // 「デフォルトモードを実行」で表示するなら | |||
// menu.Add( defaultMode + ":\tデフォルトモードを実行 ( Space& キー )", + defaultMode ); | |||
} | |||
mode = menu.Track( mePosMouse ); | |||
} | |||
/* 【include版】の設定変更サブメニュー項目を選択した場合 */ | |||
// include 版の設定変更 | |||
if ( typeof IO == "object" && mode >= 1000 ) { | |||
SettingsChange( mode ); | |||
} | |||
else { | |||
var d = document; | |||
var dCount = editor.Documents.Count; | |||
var dd, docu; | |||
switch ( mode ) { | |||
// 他のタブをすべて閉じる | |||
case 1: case 2: case 3: | |||
loop: | |||
for ( var i = 0; i < dCount; i ++ ) { | |||
docu = editor.Documents.Item( i ); | |||
if ( docu == d ) { | |||
dd = i; | |||
break loop; | |||
} | |||
} | |||
var start = ( mode == 2 ) ? dd - 1 : dCount - 1; | |||
var end = ( mode == 3 ) ? dd + 1 : 0; | |||
for ( var i = start; i + 1 > end; i -- ) { | |||
docu = editor.Documents.Item( i ); | |||
if ( docu != d ) { | |||
if ( ignoreUnNamed && ! docu.Name ) { | |||
docu.Saved = true; | |||
} | |||
docu.Close(); | |||
} | |||
} | |||
break; | |||
// すべて閉じる | |||
case 4: case 5: case 6: | |||
for ( var i = dCount- 1; i + 1 > 0; i -- ) { | |||
docu = editor.Documents.Item( i ); | |||
if ( mode == 4 && docu.Saved ) { | |||
docu.Close(); | |||
} | |||
else if ( mode == 6 | |||
|| ( mode == 5 && ignoreUnNamed && ! docu.Name ) ) { | |||
docu.Saved = true; | |||
} | |||
} | |||
if ( mode != 4 ) { | |||
window.Close(); | |||
} | |||
break; | |||
// すべて閉じる(同一ウインドウ内の全タブ) | |||
case 7: | |||
window.Close(); | |||
break; | |||
// すべて閉じる(ファイルメニューのコマンド、すべてのエディタウインドウ) | |||
case 8: | |||
editor.ExecuteCommandByID( MEID_FILE_CLOSE_ALL = 2097 ); | |||
break; | |||
// すべて保存して閉じる(ファイルメニューのコマンド、すべてのエディタウインドウ) | |||
case 9: | |||
editor.SaveCloseAll(); | |||
break; | |||
default: | |||
break; | |||
} | |||
if ( document == d ) { | |||
d.Activate(); | |||
} | |||
} | |||
/* ▼ 【include版】の追加コード ▼ */ | |||
/** | |||
* 関数 SettingsMenu( objPopupMenu ) | |||
* ポップアップメニューに「設定変更」サブメニューを表示する | |||
* 引数: メインコードのポップアップメニューオブジェクト | |||
*/ | |||
function SettingsMenu( objMenu ) { | |||
var subMenu = CreatePopupMenu(); | |||
// メニューのオプションフラグ | |||
// ※定数 meMenuChecked の値は 1 なので xxxEnable *1 で代用できる | |||
var Check = function( num ) { | |||
return + ( defaultMode.toString() == num.toString() ); | |||
} | |||
var grayFlag = settingEnable ? 0 : meMenuGrayed; | |||
// 「設定変更」サブメニューのアイテム | |||
objMenu.AddPopup( "\t設定を変更する (&S)", subMenu ); | |||
objMenu.Add( "", 100, meMenuSeparator ); | |||
subMenu.Add( "\t未保存* タブの保存を確認する (&C)", 1012, !ignoreUnNamed*1 + grayFlag ); | |||
subMenu.Add( "", 100, meMenuSeparator ); | |||
subMenu.Add( "\t▼ デフォルトモードを変更する ▼", 10 , meMenuGrayed ); | |||
subMenu.Add( "&0:\tキャンセル", 1000, Check( 0 ) + grayFlag ); | |||
subMenu.Add( "&1:\t他のタブをすべて閉じる", 1001, Check( 1 ) + grayFlag ); | |||
subMenu.Add( "&2:\t左側のタブをすべて閉じる", 1002, Check( 2 ) + grayFlag ); | |||
subMenu.Add( "&3:\t右側のタブをすべて閉じる", 1003, Check( 3 ) + grayFlag ); | |||
subMenu.Add( "&4:\t変更なしのタブをすべて閉じる", 1004, Check( 4 ) + grayFlag ); | |||
subMenu.Add( "&5:\tすべてのタブを閉じる", 1005, Check( 5 ) + grayFlag ); | |||
subMenu.Add( "&6:\t未保存* の確認なしですべて閉じる", 1006, Check( 6 ) + grayFlag ); | |||
subMenu.Add( "&7:\tすべて閉じる (同一ウインドウ)", 1007, Check( 7 ) + grayFlag ); | |||
subMenu.Add( "&8:\tすべて閉じる (全ウインドウ)", 1008, Check( 8 ) + grayFlag ); | |||
subMenu.Add( "&9:\tすべて保存して閉じる (全ウインドウ", 1009, Check( 9 ) + grayFlag ); | |||
subMenu.Add( "&10:\t(なし)", 1010, Check( "" ) + grayFlag ); | |||
subMenu.Add( "\t▲ デフォルトモードを変更する ▲", 10, meMenuGrayed ); | |||
subMenu.Add( "", 10, meMenuSeparator ); | |||
subMenu.Add( "", 10, meMenuSeparator ); | |||
subMenu.Add( "\t設定内容をロックする (&S)", 1011, !settingEnable*1 ); | |||
subMenu.Add( ( userModeInput ? "\tポップアップメニュー" : "\t入力ダイアログ" ) | |||
+ "モードに変更する (&M)", 1013, grayFlag ); | |||
subMenu.Add( "", 10, meMenuSeparator ); | |||
subMenu.Add( "\t「閉じる」マクロの JS ファイルを開く (&O)", 1014 ); | |||
subMenu.Add( "\t「閉じる」マクロの JSON ファイルを開く (&J)", 1015 ); | |||
subMenu.Add( "", 10, meMenuSeparator ); | |||
subMenu.Add( "\t設定内容を初期化する (&I)", 1016, grayFlag ); | |||
subMenu.Add( "& \tキャンセル", 0 ); | |||
} | |||
/** | |||
* 関数 SettingsChange( num ) | |||
* ポップアップメニューで選択した項目の設定状態を変更する | |||
*/ | |||
function SettingsChange( num ) { | |||
// var setting = IO.Deserialize( setting, jsonName ); | |||
var jsonPath = JsonDir() + "\\" + jsonName + ".json"; | |||
var sIsChanged = true; | |||
switch ( num ) { | |||
case 1000: case 1001: case 1002: case 1003: case 1004: | |||
case 1005: case 1006: | |||
setting.defaultMode = num - 1000; | |||
break; | |||
case 1007: case 1008: case 1009: | |||
if ( ! userModeInput ) { | |||
setting.defaultMode = num - 1000; | |||
} | |||
break; | |||
case 1010: | |||
setting.defaultMode = ""; | |||
break; | |||
case 1011: | |||
setting.settingEnable = ! settingEnable; | |||
break; | |||
case 1012: | |||
setting.ignoreUnNamed = ! ignoreUnNamed; | |||
break; | |||
case 1013: | |||
sIsChanged = false; | |||
Status = " " + ScriptName; | |||
var modeChange = userModeInput ? "ポップアップメニュー" | |||
: "入力ダイアログ"; | |||
var confirmStr = ScriptFullName + " \n\n" | |||
+ modeChange | |||
+ " モードへの変更は、ソースコード内で \n" | |||
+ "userModeInput = " + ! userModeInput | |||
+ "; に変更する必要があります。 \n\n" | |||
+ "このマクロの .JS ファイルを開きますか? "; | |||
if ( Confirm( confirmStr ) ) { | |||
OpenJumpJS( "var userModeInput = " ); | |||
} | |||
break; | |||
case 1014: | |||
sIsChanged = false; | |||
Status = " " + ScriptFullName; | |||
OpenJumpJS( "var settingEnable = " ); | |||
break; | |||
case 1015: | |||
sIsChanged = false; | |||
Status = " " + jsonPath; | |||
OpenJumpJson( jsonName ); | |||
break; | |||
case 1016: | |||
sIsChanged = false; | |||
Status = " " + jsonPath; | |||
CheckJsonFile( jsonName ); | |||
break; | |||
default: | |||
sIsChanged = false; | |||
break; | |||
} | |||
if ( sIsChanged ) { | |||
IO.Serialize( setting, jsonName ); | |||
Status = " 設定の変更を保存しました。"; | |||
} | |||
} | |||
/** | |||
* 関数 OpenJumpJS( str ) | |||
* このマクロの JS ファイルを開いて設定項目の行にジャンプする | |||
* 引数: 検索文字列(設定項目の行の文字列) | |||
* ※引数がないときは文頭 | |||
*/ | |||
function OpenJumpJS( str ) { | |||
Redraw = false; | |||
var targetStr = str || ""; | |||
// Count は 1 からの整数値、Item は 0 からの整数値 | |||
var eCount = editors.Count; | |||
var dCount, dItem, ee , dd; | |||
var isOpen = false; | |||
OuterLoop: | |||
for ( var j = 0; j < eCount; j ++ ) { | |||
dCount = editors.Item( j ).documents.Count; | |||
for ( var i = 0; i < dCount; i ++ ) { | |||
dItem = editors.Item( j ).documents.Item( i ); | |||
if ( dItem.FullName == ScriptFullName ) { | |||
isOpen = true; | |||
ee = j; | |||
dd = i; | |||
break OuterLoop; | |||
} | |||
} | |||
} | |||
if ( isOpen ) { | |||
editors.Item( ee ).documents.Item( dd ).Activate(); | |||
} | |||
else { | |||
editor.NewFile(); | |||
ee = ( editors.Count == 1 ) ? 0 : eCount; | |||
editors.Item( ee ).OpenFile( ScriptFullName ); | |||
} | |||
var js = editors.Item( ee ).ActiveDocument; | |||
var settingPos = js.Text.indexOf( targetStr ); | |||
js.selection.SetActivePos( settingPos + targetStr.length ); | |||
js.selection.WordRight( true ); // true/false を範囲選択 | |||
var vy = js.selection.GetActivePointY( mePosView ); | |||
ScrollY = vy; | |||
// 狙った行にスクロールしないようなら、強引にやる | |||
// var ly = js.selection.GetActivePointY( mePosLogical ); | |||
// var WshShell = new ActiveXObject( "WScript.Shell" ); | |||
// WshShell.Run( '"' + editor.FullName + '" /l ' + ly + ' "' | |||
// + ScriptFullName + '"' ); | |||
// ScrollY = vy; | |||
Redraw = true; | |||
} | |||
/** | |||
* 関数 OpenJumpJson( jsonName ) | |||
* JSON ファイルを開く | |||
*/ | |||
function OpenJumpJson( jsonName ) { | |||
// var jsonName = jsonName || ScriptName.replace( /\.js$/i, "" ); | |||
IO.Serialize( setting, jsonName ); | |||
Sleep( 500 ); | |||
var jsonDir = JsonDir(); | |||
var jsonPath = jsonDir + "\\" + jsonName + ".json"; | |||
if ( IO.Path.IsExist( jsonPath ) | |||
&& JsonContents( jsonPath ).length ) { | |||
var confirmStr = "設定ファイルは正常です \n\n" | |||
+ JsonContents( jsonPath ) | |||
+ "設定ファイルを開きますか? "; | |||
if ( Confirm( confirmStr ) ) { | |||
var WshShell = new ActiveXObject( "WScript.Shell" ); | |||
WshShell.Run( '"' + editor.FullName | |||
+ '" "' + jsonPath + '"' ); | |||
} | |||
} | |||
else { | |||
Alert( "設定ファイルがありません \n" | |||
+ jsonDir + " " ); | |||
} | |||
} | |||
/** | |||
* 関数 CheckJsonFile( jsonName ) | |||
* JSON ファイルの初期化/実在確認 | |||
*/ | |||
function CheckJsonFile( jsonName ) { | |||
// var jsonName = jsonName || ScriptName.replace( /\.js$/i, "" ); | |||
var jsonDir = JsonDir(); | |||
var jsonPath = jsonDir + "\\" + jsonName + ".json"; | |||
var confirmStr = jsonPath + " \n\n" | |||
+ "設定ファイルを初期化しますか? " | |||
if ( Confirm( confirmStr ) ) { | |||
IO.Serialize( initialSettings, jsonName ); | |||
Sleep( 500 ); | |||
var alertStr = ( IO.Path.IsExist( jsonPath ) | |||
&& JsonContents( jsonPath ).length ) | |||
? "設定ファイルは正常です \n\n" | |||
+ JsonContents( jsonPath ) | |||
: "設定ファイルがありません \n" | |||
+ jsonDir + " "; | |||
Alert( alertStr ); | |||
} | |||
} | |||
/** | |||
* 関数 JsonDir() | |||
* JSON ファイルの親フォルダのパス | |||
*/ | |||
function JsonDir() { | |||
var jsonDir; | |||
if ( IO.Path.IsExist( editor.FullName.replace( /\.exe$/i, ".ini" ) ) ) { | |||
jsonDir = editor.FullName.replace( /Mery\.exe$/i, "" ) | |||
+ "Macros\\MacroSettings"; | |||
} | |||
else { | |||
var WshShell = new ActiveXObject( "WScript.Shell" ); | |||
jsonDir = WshShell.ExpandEnvironmentStrings( "%APPDATA%" ) | |||
+ "\\Mery\\MacroSettings"; | |||
} | |||
return jsonDir; | |||
} | |||
/** | |||
* 関数 JsonContents( jsonPath [, bool] ) | |||
* JSON ファイルの文字列をメッセージボックス用に整形する | |||
* | |||
* 第1引数は JSON ファイルのパス | |||
* 第2引数は真偽値(省略可) | |||
* true なら \uHHHH をデコードする | |||
*/ | |||
function JsonContents( jsonPath, bool ) { | |||
var contents = ( jsonPath + " \n" | |||
+ IO.LoadFromFile( jsonPath ) | |||
.replace( /^\{/, "\n{\n " ) | |||
.replace( /\}$/g, "\n}\n\n" ) | |||
.replace( /,/g, " ,\n " ) | |||
.replace( /\":/g, "\": " ) | |||
); | |||
if ( bool ) { | |||
// 「テキスト整形」マクロより >> 符号化/復号化 >> \uHHHH デコード | |||
var Decode_uHHHH = function( str ) { | |||
return str.replace( /\\u([0-9A-Fa-f]{4})/g, function( s, n ) { | |||
return String.fromCharCode( Number( "0x" + n ) ) | |||
} ) | |||
}; | |||
return Decode_uHHHH( contents ); | |||
} | |||
else { | |||
// 半角アルファベットの小文字を全角にするなら | |||
contents = contents.replace( /[a-z]/g, | |||
function( $0 ) { | |||
return String.fromCharCode( $0.charCodeAt( 0 ) + 0xFEE0 ) | |||
} ) | |||
return contents; | |||
} | |||
} | |||
</syntaxhighlight> | |||
いつもポップアップメニューのマクロばかりなので、少しだけヒネってみました。 | |||
スポンサーリンク