スクリプトの状態を表示するアドオン
Apricotに機能拡張として、スクリプトが実行可能な状態か確認するためのアドオンを作ってみました。
コンテキストメニューの「スクリプト」を選択後、表示されるメニューでグレーアウトしているファイルは、実行不可なものです。それ以外は実行可能な状態です。
実行可能状態のものは、Apricot起動時にロードされ実行されます。
尚、デフォルトでは、スクリプトのファイルの拡張子を「.tmp」にして、実行不可にしてます。実行可能にするには、「.tmp」を外して下さい。実行不可にするには、逆の操作をして下さい。
このアドオンには、他にもファイル名を選択するとファイルを編集したり、スクリプトが格納しているフォルダを開いたりすることも出来ます。
よろしければ使ってみてください。
デスクトップマスコット「Apricot」はこちら
アプリコタン.NET (http://www.apricotan.net/)
下記のスクリプトをUTF-8でScripts.pyなどのファイル名にし保存後、Scriptsフォルダに入れれば動作します。
# -*- coding: utf-8 -*- # Scripts.py # Copyright 〓 Masaaki Kawata All rights reserved. import clr clr.AddReferenceByPartialName("mscorlib") clr.AddReferenceByPartialName("System") clr.AddReferenceByPartialName("System.Configuration") clr.AddReferenceByPartialName("System.Windows.Forms") clr.AddReferenceByPartialName("System.Xml") clr.AddReferenceByPartialName("Apricot") from System import String, Type, Environment from System.IO import File, Directory, FileInfo, DirectoryInfo, Path from System.Collections.Generic import Dictionary, KeyValuePair, List from System.Globalization import CultureInfo from System.Diagnostics import Process from System.Configuration import ConfigurationManager, ConfigurationUserLevel, ExeConfigurationFileMap from System.Reflection import Assembly from System.Windows.Forms import Application, Form, MenuItem from System.Xml import XmlDocument, XmlNode, XmlAttribute, XmlNodeType from Apricot import Script program = "notepad.exe" def onStart(s, e): global menuItem for form in Application.OpenForms: if form.ContextMenu != None: if False == form.ContextMenu.MenuItems.Contains(menuItem): form.ContextMenu.MenuItems.Add(menuItem) form.ContextMenu.Popup += onPopup def onStop(s, e): global menuItem menuItem.MenuItems.Clear() for form in Application.OpenForms: if form.ContextMenu != None: if True == form.ContextMenu.MenuItems.Contains(menuItem): form.ContextMenu.MenuItems.Remove(menuItem) form.ContextMenu.Popup -= onPopup def onClick(s, e): global dictionary if dictionary.ContainsKey(s.Text): if String.IsNullOrEmpty(program): Process.Start(dictionary[s.Text]) else: Process.Start(program, dictionary[s.Text]) def open(s, e): config = None directoryInfo = DirectoryInfo(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), Assembly.GetEntryAssembly().GetName().Name)) if directoryInfo.Exists: fileName = Path.GetFileName(Assembly.GetEntryAssembly().Location) for fileInfo in directoryInfo.GetFiles("*.config"): if fileName.Equals(Path.GetFileNameWithoutExtension(fileInfo.Name)): exeConfigurationFileMap = ExeConfigurationFileMap() exeConfigurationFileMap.ExeConfigFilename = fileInfo.FullName config = ConfigurationManager.OpenMappedExeConfiguration(exeConfigurationFileMap, ConfigurationUserLevel.None) break if config == None: config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); if config.HasFile: if config.AppSettings.Settings["Scripts"] != None: path = config.AppSettings.Settings["Scripts"].Value if Directory.Exists(path): Process.Start(path) def onPopup(s, e): global menuItem, dictionary dictionary.Clear() menuItem.MenuItems.Clear() config = None directoryInfo = DirectoryInfo(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), Assembly.GetEntryAssembly().GetName().Name)) if directoryInfo.Exists: fileName = Path.GetFileName(Assembly.GetEntryAssembly().Location) for fileInfo in directoryInfo.GetFiles("*.config"): if fileName.Equals(Path.GetFileNameWithoutExtension(fileInfo.Name)): exeConfigurationFileMap = ExeConfigurationFileMap() exeConfigurationFileMap.ExeConfigFilename = fileInfo.FullName config = ConfigurationManager.OpenMappedExeConfiguration(exeConfigurationFileMap, ConfigurationUserLevel.None) break if config == None: config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); if config.HasFile: if config.AppSettings.Settings["Scripts"] != None: path = config.AppSettings.Settings["Scripts"].Value extensionList = List[String]() appConfigPath = String.Concat(Path.Combine(Application.StartupPath, Path.GetFileName(Assembly.GetEntryAssembly().Location)), ".config") if String.IsNullOrEmpty(appConfigPath) == False: if File.Exists(appConfigPath): doc = XmlDocument() doc.Load(appConfigPath) for xmlNode in doc.SelectNodes("/configuration/microsoft.scripting/languages/language"): for xmlAttribute in xmlNode.Attributes: if xmlAttribute.Name.Equals("extensions"): extensionList.Add(xmlAttribute.Value) if String.IsNullOrEmpty(path) == False: if CultureInfo.CurrentCulture.Equals(CultureInfo.GetCultureInfo("ja-JP")): menuItem.MenuItems.Add(MenuItem(String.Concat("\"", path, "\"を開く"), open)) else: menuItem.MenuItems.Add(MenuItem(String.Concat("Open \"", path, "\""), open)) menuItem.MenuItems.Add(MenuItem("-")) if Directory.Exists(path): for fileInfo in DirectoryInfo(path).GetFiles(): mi = MenuItem(fileInfo.Name) mi.Enabled = extensionList.Contains(fileInfo.Extension) mi.Click += onClick menuItem.MenuItems.Add(mi) if dictionary.ContainsKey(mi.Text): dictionary[text] = htmlUrl else: dictionary.Add(mi.Text, fileInfo.FullName) dictionary = Dictionary[String, String]() menuItem = MenuItem() if CultureInfo.CurrentCulture.Equals(CultureInfo.GetCultureInfo("ja-JP")): menuItem.Text = "スクリプト" else: menuItem.Text = "Scripts" Script.Instance.Start += onStart Script.Instance.Stop += onStop