Создание палитры для переключения .NB-ассоциаций между установленными версиями Mathematica - PullRequest
2 голосов
/ 17 июня 2011

Я хотел бы создать палитру для переключения ассоциаций .NB-файлов между установленными версиями Mathematica под Windows.

На данный момент я разработал следующий код для перечисления установленных версий Mathematica и переключения между ними:

1) Получение списка имен ключей системного реестра установленных версий Mathematica :

installedVersions = 
 Select[Developer`EnumerateRegistrySubkeys["HKEY_CLASSES_ROOT"], 
  StringMatchQ[#, "Mathematica.NB." ~~ ___] || # === 
     "MathematicaNB" &]

=> {"Mathematica.NB.7.0.1.1213965", "MathematicaNB"}

2) Функция, которая добавляет параметры командной строки -b (отключает заставку) и -directlaunch (отключает механизм, запускающий самую последнюю установленную версию Mathematica ) к строка командной строки для запуска Mathematica FrontEnd в системном реестре:

customizeOpenCommand[id_String] := Module[{value},
   value = 
    Cases[Developer`ReadRegistryKeyValues[
      "HKEY_CLASSES_ROOT\\" ~~ id ~~ "\\shell\\open\\command"], 
     Verbatim[Rule][Null, 
       val_String /; 
        StringFreeQ[val, " -b -directlaunch "]] :> (Null -> 
        StringReplace[val, 
         path__ ~~ "\\Mathematica.exe\"" ~~ __ ~~ "\"%1\"" :> 
          path ~~ "\\Mathematica.exe\" -b -directlaunch \"%1\""])];
   Developer`WriteRegistryKeyValues[
    "HKEY_CLASSES_ROOT\\" ~~ id ~~ "\\shell\\open\\command", value]];

Эту функцию можно использовать следующим образом:

customizeOpenCommand /@ installedVersions

3) Функция для получения текущей ассоциации .NB-файла:

Null /. Developer`ReadRegistryKeyValues["HKEY_CLASSES_ROOT\\.nb"]

4) Кнопки для переключения между всеми установленными версиями Mathematica (но я думаю, что, вероятно, это можно было бы реализовать лучше, используя Dynamic и SetterBar):

Column[Button[
    Row[{"Associate .NB-files with ", Style[#, Bold], " (", 
      First@Cases[
        Developer`ReadRegistryKeyValues["HKEY_CLASSES_ROOT\\" ~~ #], 
        Verbatim[Rule][Null, str_String] :> str], ")"}], 
    Developer`WriteRegistryKeyValues["HKEY_CLASSES_ROOT\\.nb", 
     Null -> #], Alignment -> Left] & /@ installedVersions]

В дополнение к вышесказанному здесь есть команда, которая запрещает совместное использование предпочтений между различными установленными версиями Mathematica (по умолчанию все установленные версии используют один файл для хранения настроек FrontEnd):

SetOptions[$FrontEnd, "VersionedPreferences" -> True]

Итак, моя проблема:

Как создать и установить небольшой Palette, который будет динамически отображать текущие ассоциации файлов для .NB-файлов и позволит переключаться между ними, нажимая кнопку? Я думаю, что это, вероятно, может быть реализовано только с SetterBar, но я все еще неопытен с Dynamic и созданием палитры.

1 Ответ

1 голос
/ 17 июня 2011

До этого момента я пришел к следующему решению:

CreatePalette@
  Framed[DynamicModule[{b, installedVersions}, 
    Dynamic[Column[
      Join[{Style["Associate .NB-files with:", Bold], 
        SetterBar[
         Dynamic[val, 
          Function[{v, e}, 
           Developer`WriteRegistryKeyValues["HKEY_CLASSES_ROOT\\.nb", 
            Null -> v]; 
           e = Null /. 
             Developer`ReadRegistryKeyValues[
              "HKEY_CLASSES_ROOT\\.nb"], HoldRest], 
          Initialization -> (installedVersions = 
             Select[Developer`EnumerateRegistrySubkeys[
               "HKEY_CLASSES_ROOT"], 
              StringMatchQ[#, "Mathematica.NB." ~~ ___] || # === 
                 "MathematicaNB" &]; 
            If[StringFreeQ[
                value = 
                 Null /. 
                  Developer`ReadRegistryKeyValues[
                   "HKEY_CLASSES_ROOT\\" ~~ # ~~ 
                    "\\shell\\open\\command"], " -b -directlaunch "], 
               Developer`WriteRegistryKeyValues[
                "HKEY_CLASSES_ROOT\\" ~~ # ~~ 
                 "\\shell\\open\\command", 
                Null -> 
                 StringReplace[value, 
                  path__ ~~ "\\Mathematica.exe\"" ~~ __ ~~ "\"%1\"" :>
                    path ~~ 
                    "\\Mathematica.exe\" -b -directlaunch \"%1\""]]] \
& /@ installedVersions)], installedVersions, 
         Appearance -> "Vertical"]}, 
       If[Last@Last@Options[$FrontEnd, "VersionedPreferences"] === 
          False && 
         b == True, {Button[
          Pane[Style[
            "This FrontEnd uses shared preferences file. Press this \
button to set FrontEnd to use versioned preferences file (all the \
FrontEnd settings will be reset to defaults).", Red], 300], 
          AbortProtect[
           SetOptions[$FrontEnd, "VersionedPreferences" -> True]; 
           b = False]]}, {}]], Alignment -> Center], 
     Initialization :> 
      If[! Last@Last@Options[$FrontEnd, "VersionedPreferences"], 
       b = True, b = False]]], FrameMargins -> {{0, 0}, {0, 5}}, 
   FrameStyle -> None];

Эту палитру можно установить постоянно с помощью пункта меню «Установить палитру ...» в меню «Палитра».

Вот как это выглядит:

screenshot1 screenshot2

Любые предложения и улучшения приветствуются!


Поскольку все установленные версии Mathematica совместно использует те же $BaseDirectory и $UserBaseDirectory, рекомендуется устанавливать эту палитру в самой старой установленной версии, чтобы избежать стандартного всплывающего предупреждения:

Этот блокнот был создан в более поздней версииверсия Mathematica, и может не работать должным образом со старым интерфейсом, который вы используете.Свяжитесь с Wolfram Research (www.wolfram.com) для получения информации об обновлении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...