スクリプトの状態を表示するアドオン

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