%%
%% This is file `pmdb.sty',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% pmdb.dtx  (with options: `copyright,package')
%% 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% pmdb.sty package,,                                    %%
%% Copyright (C) 2019  D. P. Story                       %%
%%   dpstory@uakron.edu  dpstory@acrotex.net             %%
%%                                                       %%
%% This program can redistributed and/or modified under  %%
%% the terms of the LaTeX Project Public License         %%
%% Distributed from CTAN archives in directory           %%
%% macros/latex/base/lppl.txt; either version 1.2 of the %%
%% License, or (at your option) any later version.       %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{pmdb}
 \ProvidesPackage{pmdb}[2019/12/09 v0.4 Mark for input files]
\edef\th@dquoteCat{\the\catcode`\"}
\catcode`\"=12\relax
\newif\ifpmdbmode \pmdbmodetrue
\DeclareOption{dbmode}{\pmdbmodetrue}
\DeclareOption{!dbmode}{\pmdbmodefalse}
\newif\ifpmdbtight \pmdbtightfalse
\DeclareOption{tight}{\pmdbtighttrue}
\DeclareOption{!tight}{\pmdbtightfalse}
\ProcessOptions
\RequirePackage{eforms}
\def\pmdb@ckThor{\@ifundefined{essayQ}{\let\essayQ\@gobble}{}}
\AtBeginDocument{\pmdb@ckThor}
\newif\ifpmdbFP \pmdbFPfalse
\newif\ifpmdbDQs \pmdbDQsfalse
\newcount\pmdb@Cnt
\def\pmCBPresets#1{\def\pm@CBPresets{#1}}
\pmCBPresets{}
\def\cbSelectInput#1{\checkBox[\TU{#1}\presets{\pm@CBPresets}
    \cmd{\bParams{#1}{\the\pmdb@Cnt}\eParams}
    \AAmouseup{\ccBoxMU}
  ]{pmdbCkBx.\the\pmdb@Cnt}{11bp}{11bp}{On}%
  \global\advance\pmdb@Cnt\@ne}
\def\insertCkBx#1{\def\@insertCkBx##1{#1}}
\def\setCBsMarg{%
  \ifpmdbtight
    \if@reversemargin
      \def\pmAlignCBAlt{\ifodd\value{page}\leavevmode\hfill\else\fi}\else
      \def\pmAlignCBAlt{\ifodd\value{page}\else\hfill\fi}\fi
  \else
    \if@reversemargin
      \def\pmAlignCBAlt{\ifodd\value{page}\hfil\else\hfil\fi}\else
      \def\pmAlignCBAlt{\ifodd\value{page}\hfill\else\fi}\fi
  \fi
}
\def\altCBMargins{\let\pmAlignCB\pmAlignCBAlt}
\def\pmAlignCB{%
  \if@reversemargin
    \ifpmdbtight\hfill\else\fi
  \else
    \ifpmdbtight\else\hfill\fi
  \fi
}
\@ifundefined{chapter}{}{\AtBeginDocument{\setCBsMarg\altCBMargins}}
\def\InputParas{%\let\pmAlignCB\relax
  \insertCkBx{\ifpmdbmode
  \everypar{\marginpar{\pmAlignCB\cbSelectInput{##1}}\global\everypar{}}\fi}}
\InputParas
\newcount\saveQNo \saveQNo\z@
\def\pmHook@qzItems{%
  \let\item@pmOld\item
  \def\item@pnNew{\item@pmOld\itemhook\let\item\item@pmOld}%
  \let\item\item@pnNew}
\def\InputQuizItems{\let\pmHook\pmHook@qzItems
  \saveQNo\z@
  \insertCkBx{\def\cbInQzMargin{\cbSelectInput{##1}}}%
  \ItemHook{\leavevmode\ifpmdbmode
  \ifnum\saveQNo<\value{eqquestionnoi}%
    \marginpar{\pmAlignCB\cbInQzMargin}\fi
  \saveQNo=\arabic{eqquestionnoi}\fi}}
\def\pmHook@item{\let\item@pmOld\item
  \def\item@pmNew{%
    \ifx\pmiarg\@empty
      \ifx\pm@Brk\ef@YES
        \def\pm@next{\item@pmOld[]}\else
        \let\pm@next\item@pmOld
      \fi
    \else
      \def\pm@next{\item@pmOld[\pmiarg]}%
    \fi\pm@next\itemhook\let\item\item@pmOld}%
  \let\item\item@pmNew
}
\def\ItemHook#1{\def\itemhook{#1}}
\def\InputItems{\let\pmHook\pmHook@item
  \insertCkBx{\def\cbInQzMargin{\cbSelectInput{##1}}}%
  \ItemHook{\leavevmode\ifpmdbmode
  \marginpar{\pmAlignCB\cbInQzMargin}\fi}}
\let\pmHook\relax
\def\ckBxInput#1{\@insertCkBx{#1}%
  \ifpmdbDQs\def\donext{\pmHook\input{"#1"}}\else
    \def\donext{\pmHook\input{#1}}\fi
  \donext}
\def\displayChoiceCA#1{\def\displayChoice@CA{#1}}
\def\displayChoiceTU#1{\def\displayChoice@TU{#1}}
\displayChoiceCA{Display Choices}
\displayChoiceTU{Lists all choices in the console window}
\newcommand{\displayChoices}[3][]{\pushButton[\TU{\displayChoice@TU}
  \CA{\displayChoice@CA}#1\AAmouseup{\sldInputs}\protect\AA
]{sldInputs}{#2}{#3}}
\def\clrChoicesCA#1{\def\clrChoices@CA{#1}}
\def\clrChoicesTU#1{\def\clrChoices@TU{#1}}
\clrChoicesCA{Clear Choices}
\clrChoicesTU{Clears all check boxes created by pmdb}
\newcommand{\clrChoices}[3][]{\pushButton[\TU{\clrChoices@TU}
  \CA{\clrChoices@CA}#1\AAmouseup{\clrAction}\protect\AA
]{sldInputs}{#2}{#3}}
\def\pmInput{\@ifnextchar[%]
  {\let\pm@Brk\ef@YES\inputConta}
  {\let\pm@Brk\ef@NO\inputConta}}
\let\pm@Brk\ef@NO
\def\inputConta{\bgroup\@makeother\"\inputContb}
\newcommand\inputContb[2][]{\egroup\def\pmiarg{#1}\inputConti#2;;}
\def\inputConti{\@ifnextchar"%
  {\global\pmdbDQstrue\removedqs}
  {\global\pmdbDQsfalse\removesemis}}
\def\removedqs"#1";;{\inputContii{#1}}
\def\removesemis#1;;{\inputContii{#1}}
\def\inputContii#1{\isItFullPath#1:\@nil\doinput{#1}}
\def\isItFullPath#1:#2\@nil{%
  \def\@rgii{#2}\ifx\@rgii\@empty
    \global\pmdbFPfalse\else
    \global\pmdbFPtrue\fi}
\def\doinput#1{\ifpmdbmode\def\donext{\ckBxInput{#1}}\else
  \ifpmdbDQs\def\donext{\input{"#1"}}\else
    \def\donext{\input{#1}}\fi\fi
  \donext}
\def\pmInputWarni{\PackageWarningNoLine{pmdb}{The command \string\Input\space
  is already defined.\MessageBreak
  The checkboxes may not appear in the margins.\MessageBreak
  Use the supported command \string\pmInput\space instead}}
\def\pmInputWarnii{\PackageWarningNoLine{pmdb}{Letting
  \string\Input\space to \string\pmInput. You are \MessageBreak
  encouraged to use the supported\MessageBreak
  command \string\pmInput\space instead}}
\def\pmInputChk{\@ifundefined{Input}{\let\Input\pmInput\pmInputWarnii}
  {\pmInputWarni}}
\AtBeginDocument{\pmInputChk}
\begin{defineJS}[\makeesc\@\catcode`\%=14\relax]{\ccBoxMU}
@ifpmdbFP%
event.target.userName=("@p(1)");
@else%
// device independent path
var pos=this.path.lastIndexOf("/");
var thispath=this.path.substring(0,pos+1);
pos=this.path.indexOf("/",1);
var drive=thispath.substring(0,pos);
var platform=app.platform;
if (platform=="WIN")
  thispath=drive+":/"+thispath.substring(pos+1);
event.target.userName=thispath+("@p(1)");
@fi%
if (event.modifier){
  var _to=app.setTimeOut("_restoreCCState('pmdbCkBx.@p(2)');",.05);
  try {
  aebTrustedFunctions(this,aebLaunchURL,
    {cURL: "file://"+event.target.userName});
  } catch(e) {
    console.show();
    console.println("The Ctrl+Click action is not supported, %
installation of aeb\_pro.js is required.");
  }
} else {
  if (event.target.isBoxChecked(0)){
    _oSPaths["pmdbCkBx.@p(2)"]=%
[("@p(1)"),@ifpmdbDQs true@else false@fi];
    _aInputs[@p(2)]=true;
    _numInputs++;
  }else{
    _oSPaths["pmdbCkBx.@p(2)"]=null;
    _aInputs[@p(2)]=false;
    _numInputs--;
  }
  event.target["_boxState"]=!!event.target.isBoxChecked(0);
}
\end{defineJS}
\begin{defineJS}[\catcode`\%=14\relax]{\sldInputs}
console.clear();console.show();
if (_numInputs==0) console.println("No inputs selected");
else {
  for(var i=0;i<_aInputs.length;i++){
    if (!!_aInputs[i]){
      if(_oSPaths["pmdbCkBx."+i][1])
        console.println(%
'\\\\input\{\\"'+(_oSPaths["pmdbCkBx."+i][0])+'\\"\}');
      else
        console.println(%
'\\\\input\{'+(_oSPaths["pmdbCkBx."+i][0])+'\}');
    }
  }
}
\end{defineJS}
\begin{defineJS}{\clrAction}
var _oSPaths=new Object;
var _aInputs=new Array;
var _numInputs=0;
this.resetForm("pmdbCkBx");
\end{defineJS}
\begin{insDLJS}{mrki}{Supporting JavaScript for pmdb}
var _oSPaths=new Object;
var _aInputs=new Array;
var _numInputs=0;
function _restoreCCState(fName){
  var f=this.getField(fName);
  var _ccState=%
(typeof f["_boxState"]=="undefined")?false:f["_boxState"];
  f["_boxState"]=_ccState;
  return f.checkThisBox(0,_ccState);
}
\end{insDLJS}
\catcode`\"=\th@dquoteCat
\endinput
%%
%% End of file `pmdb.sty'.
