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

Я хотел бы создать палитру для переключения ассоциаций .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 и созданием палитры.


person Alexey Popkov    schedule 17.06.2011    source источник


Ответы (1)


На данный момент я пришел к следующему решению:

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скриншот2

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


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

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

person Alexey Popkov    schedule 17.06.2011