From: Jason Ledbetter on
Folk,
I'm attempting to create a dynamically-appearing set of choices/menus using
ButtonBar in a notebook window but I've been unable to get the desired
affect to date. I've cobbled together the following code which almost does
what I'm looking for but I could use some pointers in getting the rest of
the way.

The goal here is for the "topMenu" items to appear when the notebook is
first instantiated and for the "secondMenu" option to appear when a
"topMenu" option is selected. As it stands now, I'm having to start with the
"secondMenu" option pre-defined to a bogus value.

If I were to abstract my goal some more, I'm trying to figure out how to
dynamically add/remove RowBox items that include ButtonBars from the
notebook based on options that are selected.

I'm guessing that I somehow need to programmatically generate the contents
of a Dynamically wrapped RowBox (e.g., Dynamic[RowBox[...]]) but I'm not
quite sure how to go about that just yet.

Any help is greatly appreciated...

Here's what I have thus far:

--snip--
Module[

{topMenu, secondMenu},

topMenu = {"option1", "option2"};
secondMenu = {"No option selected"};

menuChoice[choice_] := Module[{},
Switch[choice,
"option1", secondMenu = {"one", "selected"},
"option2", secondMenu = {"two", "selected"}, _, Print[choice]
]];

CreateWindow[DockedCells -> Cell[
RowBox[
{
ToBoxes[
ButtonBar[ToString[#] :> menuChoice[#] & /@ topMenu]
],
ToBoxes[
Dynamic[
ButtonBar[ToString[#] :> menuChoice[#] & /@ secondMenu]
]
]
}
],
"DockedCell"],
TextAlignment -> Center
]
];

--snip--


thanks,


-jbl

From: David Reiss on
I realize that I didn't actually address your specific question
directly, but I hope that the tips I gave are applicable to your
problem...

--David

On Oct 20, 4:51 am, Jason Ledbetter <jasonbr...(a)gmail.com> wrote:
> Folk,
> I'm attempting to create a dynamically-appearing set of choices/menus usi=
ng
> ButtonBar in a notebook window but I've been unable to get the desired
> affect to date. I've cobbled together the following code which almost doe=
s
> what I'm looking for but I could use some pointers in getting the rest of
> the way.
>
> The goal here is for the "topMenu" items to appear when the notebook is
> first instantiated and for the "secondMenu" option to appear when a
> "topMenu" option is selected. As it stands now, I'm having to start with =
the
> "secondMenu" option pre-defined to a bogus value.
>
> If I were to abstract my goal some more, I'm trying to figure out how to
> dynamically add/remove RowBox items that include ButtonBars from the
> notebook based on options that are selected.
>
> I'm guessing that I somehow need to programmatically generate the content=
s
> of a Dynamically wrapped RowBox (e.g., Dynamic[RowBox[...]]) but I'm not
> quite sure how to go about that just yet.
>
> Any help is greatly appreciated...
>
> Here's what I have thus far:
>
> --snip--
> Module[
>
> {topMenu, secondMenu},
>
> topMenu = {"option1", "option2"};
> secondMenu = {"No option selected"};
>
> menuChoice[choice_] := Module[{},
> Switch[choice,
> "option1", secondMenu = {"one", "selected"},
> "option2", secondMenu = {"two", "selected"}, _, Print[choice=
]
> ]];
>
> CreateWindow[DockedCells -> Cell[
> RowBox[
> {
> ToBoxes[
> ButtonBar[ToString[#] :> menuChoice[#] & /@ topMenu]
> ],
> ToBoxes[
> Dynamic[
> ButtonBar[ToString[#] :> menuChoice[#] & /@ secondMenu=
]
> ]
> ]
> }
> ],
> "DockedCell"],
> TextAlignment -> Center
> ]
> ];
>
> --snip--
>
> thanks,
>
> -jbl


From: Adam Griffith on
I would suggest placing the code for the menus in a DynamicModule.


Notebook[........ ,
DockedCells->Cell[BoxData[ToBoxes(a)DynamicModule[..... all code.....],
"DockedCell"]]

-Adam

Jason Ledbetter wrote:
> Folk,
> I'm attempting to create a dynamically-appearing set of choices/menus using
> ButtonBar in a notebook window but I've been unable to get the desired
> affect to date. I've cobbled together the following code which almost does
> what I'm looking for but I could use some pointers in getting the rest of
> the way.
>
> The goal here is for the "topMenu" items to appear when the notebook is
> first instantiated and for the "secondMenu" option to appear when a
> "topMenu" option is selected. As it stands now, I'm having to start with the
> "secondMenu" option pre-defined to a bogus value.
>
> If I were to abstract my goal some more, I'm trying to figure out how to
> dynamically add/remove RowBox items that include ButtonBars from the
> notebook based on options that are selected.
>
> I'm guessing that I somehow need to programmatically generate the contents
> of a Dynamically wrapped RowBox (e.g., Dynamic[RowBox[...]]) but I'm not
> quite sure how to go about that just yet.
>
> Any help is greatly appreciated...
>
> Here's what I have thus far:
>
> --snip--
> Module[
>
> {topMenu, secondMenu},
>
> topMenu = {"option1", "option2"};
> secondMenu = {"No option selected"};
>
> menuChoice[choice_] := Module[{},
> Switch[choice,
> "option1", secondMenu = {"one", "selected"},
> "option2", secondMenu = {"two", "selected"}, _, Print[choice]
> ]];
>
> CreateWindow[DockedCells -> Cell[
> RowBox[
> {
> ToBoxes[
> ButtonBar[ToString[#] :> menuChoice[#] & /@ topMenu]
> ],
> ToBoxes[
> Dynamic[
> ButtonBar[ToString[#] :> menuChoice[#] & /@ secondMenu]
> ]
> ]
> }
> ],
> "DockedCell"],
> TextAlignment -> Center
> ]
> ];
>
> --snip--
>
>
> thanks,
>
>
> -jbl
>

From: Jason Ledbetter on
Hmm. That organizational structure is different than what I'm using. I guess
I need to comprehend the box structure of mathematica... for example
"BoxData" doesn't seem to be a documented primitive (It is referenced
inside the Cell[] documentation as a one-liner).
Is there a how-to or otherwise some documentation that describes when to use
BoxData vs. ToBoxes vs. whatever or is it one of those "It depends and it's
complicated" things?

-jbl

On Tue, Oct 20, 2009 at 2:09 PM, Adam Griffith <adamg(a)wolfram.com> wrote:

> I would suggest placing the code for the menus in a DynamicModule.
>
>
> Notebook[........ , DockedCells->Cell[BoxData[ToBoxes(a)DynamicModule[.....
> all code.....], "DockedCell"]]
>
> -Adam
>
>
> Jason Ledbetter wrote:
>
>> Folk,
>> I'm attempting to create a dynamically-appearing set of choices/menus
>> using
>> ButtonBar in a notebook window but I've been unable to get the desired
>> affect to date. I've cobbled together the following code which almost does
>> what I'm looking for but I could use some pointers in getting the rest of
>> the way.
>>
>> The goal here is for the "topMenu" items to appear when the notebook is
>> first instantiated and for the "secondMenu" option to appear when a
>> "topMenu" option is selected. As it stands now, I'm having to start with
>> the
>> "secondMenu" option pre-defined to a bogus value.
>>
>> If I were to abstract my goal some more, I'm trying to figure out how to
>> dynamically add/remove RowBox items that include ButtonBars from the
>> notebook based on options that are selected.
>>
>> I'm guessing that I somehow need to programmatically generate the contents
>> of a Dynamically wrapped RowBox (e.g., Dynamic[RowBox[...]]) but I'm not
>> quite sure how to go about that just yet.
>>
>> Any help is greatly appreciated...
>>
>> Here's what I have thus far:
>>
>> --snip--
>> Module[
>>
>> {topMenu, secondMenu},
>>
>> topMenu = {"option1", "option2"};
>> secondMenu = {"No option selected"};
>>
>> menuChoice[choice_] := Module[{},
>> Switch[choice,
>> "option1", secondMenu = {"one", "selected"},
>> "option2", secondMenu = {"two", "selected"}, _, Print[choice]
>> ]];
>>
>> CreateWindow[DockedCells -> Cell[
>> RowBox[
>> {
>> ToBoxes[
>> ButtonBar[ToString[#] :> menuChoice[#] & /@ topMenu]
>> ],
>> ToBoxes[
>> Dynamic[
>> ButtonBar[ToString[#] :> menuChoice[#] & /@ secondMenu]
>> ]
>> ]
>> }
>> ],
>> "DockedCell"],
>> TextAlignment -> Center
>> ]
>> ];
>>
>> --snip--
>>
>>
>> thanks,
>>
>>
>> -jbl
>>
>>
>
From: Adam Griffith on
Hi Jason,

Yes, the documentation on these topics is in the works for a future
Mathematica release.

The trick here is to notice that the option DockedCells takes low-level
cell expressions. So anything that is included must be written in the
low-level box structure of the front end. For example, type something
into an input cell, run it, and then choose Cell>Show Cell Expression on
the output cell to view the low-level code.

So what I did here:
Notebook[........ ,
DockedCells->Cell[BoxData[ToBoxes(a)DynamicModule[..... all code.....]],
"DockedCell"]]

was to let the front end generate the necessary box structure for the
DynamicModule by using ToBoxes[] since I didn't want to have to write it
myself. For example,

In[1]:= ToBoxes[a + b^2]

Out[1]= RowBox[{"a", "+", SuperscriptBox["b", "2"]}]

Then since we are dealing with boxes, the contents are wrapped in
BoxData[].

Hope this helps,
-Adam

Jason Ledbetter wrote:
> Hmm. That organizational structure is different than what I'm using. I
> guess I need to comprehend the box structure of mathematica... for
> example "BoxData" doesn't seem to be a documented primitive (It is
> referenced inside the Cell[] documentation as a one-liner).
>
> Is there a how-to or otherwise some documentation that describes when
> to use BoxData vs. ToBoxes vs. whatever or is it one of those "It
> depends and it's complicated" things?
>
> -jbl
>
> On Tue, Oct 20, 2009 at 2:09 PM, Adam Griffith <adamg(a)wolfram.com
> <mailto:adamg(a)wolfram.com>> wrote:
>
> I would suggest placing the code for the menus in a DynamicModule.
>
>
> Notebook[........ ,
> DockedCells->Cell[BoxData[ToBoxes(a)DynamicModule[..... all
> code.....], "DockedCell"]]
>
> -Adam
>
>
> Jason Ledbetter wrote:
>
> Folk,
> I'm attempting to create a dynamically-appearing set of
> choices/menus using
> ButtonBar in a notebook window but I've been unable to get the
> desired
> affect to date. I've cobbled together the following code which
> almost does
> what I'm looking for but I could use some pointers in getting
> the rest of
> the way.
>
> The goal here is for the "topMenu" items to appear when the
> notebook is
> first instantiated and for the "secondMenu" option to appear
> when a
> "topMenu" option is selected. As it stands now, I'm having to
> start with the
> "secondMenu" option pre-defined to a bogus value.
>
> If I were to abstract my goal some more, I'm trying to figure
> out how to
> dynamically add/remove RowBox items that include ButtonBars
> from the
> notebook based on options that are selected.
>
> I'm guessing that I somehow need to programmatically generate
> the contents
> of a Dynamically wrapped RowBox (e.g., Dynamic[RowBox[...]])
> but I'm not
> quite sure how to go about that just yet.
>
> Any help is greatly appreciated...
>
> Here's what I have thus far:
>
> --snip--
> Module[
>
> {topMenu, secondMenu},
>
> topMenu = {"option1", "option2"};
> secondMenu = {"No option selected"};
>
> menuChoice[choice_] := Module[{},
> Switch[choice,
> "option1", secondMenu = {"one", "selected"},
> "option2", secondMenu = {"two", "selected"}, _, Print[choice]
> ]];
>
> CreateWindow[DockedCells -> Cell[
> RowBox[
> {
> ToBoxes[
> ButtonBar[ToString[#] :> menuChoice[#] & /@ topMenu]
> ],
> ToBoxes[
> Dynamic[
> ButtonBar[ToString[#] :> menuChoice[#] & /@ secondMenu]
> ]
> ]
> }
> ],
> "DockedCell"],
> TextAlignment -> Center
> ]
> ];
>
> --snip--
>
>
> thanks,
>
>
> -jbl
>
>
>