From: Neil Humphries on 9 Oct 2009 11:01 I must be missing something basic. I am trying to program a togglebutton to change labels based on whether it is pressed or not, but can't get it to work. As long as MyRibbon is valid, nothing changes. If because of editting VBA MyRibbon becomes invalid the button shows its toggled state. This is the code I am using: 'Callback for tButMAXAdmin00 onAction Sub MinimizeMaxAdminRFPBar(control As IRibbonControl, ByVal pressed) MyPressed = pressed If (Not MyRibbon Is Nothing) Then MyRibbon.InvalidateControl ("tButMAXAdmin00") End If End Sub Sub getVisible(control As IRibbonControl, ByRef visible) MyTag = "TDRFP" 'if max/min button pressed If control.Tag = "show" Then visible = True 'toggle visibility of other controls in same group If control.Tag Like MyTag Then visible = Not (visible) End If End If End Sub Sub getLabel(control As IRibbonControl, ByRef label) Select Case control.ID Case Is = "cButMAXAdmin99" 'this doesn't work because label is undefined when passed ByRef If label = "Minimize Group" Then label = "Maximize Group" Else label = "Minimize Group" End If Case Is = "tButMAXAdmin00" If MyPressed Then label = "Maximize Group" Else label = "Minimize Group" End If Case Else 'do nothing End Select End Sub Sub getPressed(control As IRibbonControl, ByRef toggleState) Select Case control.ID Case Is = "tButMAXAdmin00" MyPressed = Not (MyPressed) Case Else 'do nothing End Select toggleState = MyPressed End Sub If I want to use the togglestate of this button to control the visibility of other controls in the same group, how do I iterate through the other controls and can I manipulate the visible attribute directly or do I have to use getVisible in the XML for the control?
From: Neil Humphries on 9 Oct 2009 14:44 I have resolved the appearance & labelling of the toggle button. I needed to change the onAction callback to pressed as boolean rather then ByRef pressed or ByVal pressed, then clean up the togglestate logic. That leaves me with wanting to use the togglestate of this button to control the visibility of other controls in the same group. How do I iterate through the other controls and can I manipulate the visible attribute directly or do I have to use getVisible in the XML for the control? "Neil Humphries" wrote: > I must be missing something basic. I am trying to program a togglebutton to > change labels based on whether it is pressed or not, but can't get it to > work. As long as MyRibbon is valid, nothing changes. If because of editting > VBA MyRibbon becomes invalid the button shows its toggled state. This is the > code I am using: > > 'Callback for tButMAXAdmin00 onAction > Sub MinimizeMaxAdminRFPBar(control As IRibbonControl, ByVal pressed) > MyPressed = pressed > If (Not MyRibbon Is Nothing) Then > MyRibbon.InvalidateControl ("tButMAXAdmin00") > End If > End Sub > > Sub getVisible(control As IRibbonControl, ByRef visible) > MyTag = "TDRFP" > 'if max/min button pressed > If control.Tag = "show" Then > visible = True > 'toggle visibility of other controls in same group > If control.Tag Like MyTag Then > visible = Not (visible) > End If > End If > End Sub > > Sub getLabel(control As IRibbonControl, ByRef label) > Select Case control.ID > Case Is = "cButMAXAdmin99" > 'this doesn't work because label is undefined when passed ByRef > If label = "Minimize Group" Then > label = "Maximize Group" > Else > label = "Minimize Group" > End If > Case Is = "tButMAXAdmin00" > If MyPressed Then > label = "Maximize Group" > Else > label = "Minimize Group" > End If > Case Else > 'do nothing > End Select > End Sub > > Sub getPressed(control As IRibbonControl, ByRef toggleState) > Select Case control.ID > Case Is = "tButMAXAdmin00" > MyPressed = Not (MyPressed) > Case Else > 'do nothing > End Select > toggleState = MyPressed > End Sub > > If I want to use the togglestate of this button to control the visibility of > other controls in the same group, how do I iterate through the other controls > and can I manipulate the visible attribute directly or do I have to use > getVisible in the XML for the control? > >
From: Greg Maxey on 9 Oct 2009 15:04 Neil, I can't say this is the only way, but the way I do it is to invalidate the ribbon. The following XML and code shows a Ribbon with a functional toggle button that will show or hide a Test Button 1 control: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="Onload"> <ribbon> <tabs> <tab id="CustomTab" label="My Tab"> <group id="SampleGroup" label="Sample Group"> <toggleButton id="myTB1" size="large" getLabel="GetLabel" getPressed="GetPressed" getImage="GetImage" onAction="MyActionMacro"/> <button id="myTestButton1" label="Test Button 1" getVisible="GetVisible"/> </group> </tab> </tabs> </ribbon> </customUI> Option Explicit Public myRibbon As IRibbonUI Private bState As Boolean Sub Onload(ribbon As IRibbonUI) Set myRibbon = ribbon bState = True 'Set initial state of toggle button (condition, label, image) End Sub Sub GetImage(control As IRibbonControl, ByRef image) Select Case control.ID Case "myTB1" If bState Then image = "FileOpen" Else image = "FileClose" End If Case Else 'Do Nothing End Select End Sub Sub GetPressed(control As IRibbonControl, ByRef state) If bState Then state = False 'Not depressed Else state = True 'Depressed End If 'You can use the GetPressed callback to perform simple toggle actions e.g.,: If Selection.Font.Size = 12 Then Selection.Font.Size = 6 Else Selection.Font.Size = 12 End If End Sub Sub MyActionMacro(ByVal control As IRibbonControl, pressed As Boolean) 'pressed is true if the toggle is clicked while in the "not depressed" state. If pressed Then bState = False MsgBox "The folder is shutting" Selection.Font.Color = wdColorRed Else bState = True MsgBox "The folder is opening" Selection.Font.Color = wdColorAutomatic End If myRibbon.Invalidate End Sub Sub getLabel(ByVal control As IRibbonControl, ByRef label) Select Case control.ID Case "myTB1" Select Case bState Case True label = "Open" Case Else label = "Shut" End Select Case Else 'Do nothing End Select End Sub Sub GetVisible(ByVal control As IRibbonControl, ByRef returnedVal) Select Case control.ID Case "myTestButton1" If bState Then returnedVal = True Else returnedVal = False End If End Select End Sub Neil Humphries wrote: > I have resolved the appearance & labelling of the toggle button. I > needed to change the onAction callback to pressed as boolean rather > then ByRef pressed or ByVal pressed, then clean up the togglestate > logic. > > That leaves me with wanting to use the togglestate of this button to > control the visibility of other controls in the same group. How do I > iterate through the other controls and can I manipulate the visible > attribute directly or do I have to use > getVisible in the XML for the control? > > > "Neil Humphries" wrote: > >> I must be missing something basic. I am trying to program a >> togglebutton to change labels based on whether it is pressed or not, >> but can't get it to work. As long as MyRibbon is valid, nothing >> changes. If because of editting VBA MyRibbon becomes invalid the >> button shows its toggled state. This is the code I am using: >> >> 'Callback for tButMAXAdmin00 onAction >> Sub MinimizeMaxAdminRFPBar(control As IRibbonControl, ByVal pressed) >> MyPressed = pressed >> If (Not MyRibbon Is Nothing) Then >> MyRibbon.InvalidateControl ("tButMAXAdmin00") >> End If >> End Sub >> >> Sub getVisible(control As IRibbonControl, ByRef visible) >> MyTag = "TDRFP" >> 'if max/min button pressed >> If control.Tag = "show" Then >> visible = True >> 'toggle visibility of other controls in same group >> If control.Tag Like MyTag Then >> visible = Not (visible) >> End If >> End If >> End Sub >> >> Sub getLabel(control As IRibbonControl, ByRef label) >> Select Case control.ID >> Case Is = "cButMAXAdmin99" >> 'this doesn't work because label is undefined when >> passed ByRef If label = "Minimize Group" Then >> label = "Maximize Group" >> Else >> label = "Minimize Group" >> End If >> Case Is = "tButMAXAdmin00" >> If MyPressed Then >> label = "Maximize Group" >> Else >> label = "Minimize Group" >> End If >> Case Else >> 'do nothing >> End Select >> End Sub >> >> Sub getPressed(control As IRibbonControl, ByRef toggleState) >> Select Case control.ID >> Case Is = "tButMAXAdmin00" >> MyPressed = Not (MyPressed) >> Case Else >> 'do nothing >> End Select >> toggleState = MyPressed >> End Sub >> >> If I want to use the togglestate of this button to control the >> visibility of other controls in the same group, how do I iterate >> through the other controls and can I manipulate the visible >> attribute directly or do I have to use getVisible in the XML for the >> control? -- Greg Maxey See my web site http://gregmaxey.mvps.org for an eclectic collection of Word Tips. "It is not the critic who counts, not the man who points out how the strong man stumbles, or where the doer of deeds could have done them better. The credit belongs to the man in the arena, whose face is marred by dust and sweat and blood, who strives valiantly...who knows the great enthusiasms, the great devotions, who spends himself in a worthy cause, who at the best knows in the end the triumph of high achievement, and who at the worst, if he fails, at least fails while daring greatly, so that his place shall never be with those cold and timid souls who have never known neither victory nor defeat." - TR
From: Neil Humphries on 9 Oct 2009 16:41 That is what I needed. Thanks. Is it possible or advantageous to invalidate a group and all it's controls rather than the whole ribbon? I filter what is toggled by the tag property however I just discovered that separators don't have a tag property. That seems odd and will force more convoluted logic to control their visibility. Sub getVisible(control As IRibbonControl, ByRef visible) MyTag = "TDRFP" If MyPressed Then If control.Tag Like MyTag Then visible = False ElseIf control.Tag = "show" Then visible = True End If Debug.Print "Control id is like ", control.ID If control.ID Like "SepMaxAdmin" Then visible = False End If Else visible = True End If End Sub My separators have ID's of SepMaxAdmin2 and SepMaxAdmin3. <separator id="SepMaxAdmin2" getVisible="getVisible" /> <separator id="SepMaxAdmin3" getVisible="getVisible" /> The following code has no effect on their visibility: If control.ID Like "SepMaxAdmin" Then visible = False End If Any suggestions? "Greg Maxey" wrote: > Neil, > > I can't say this is the only way, but the way I do it is to invalidate the > ribbon. The following XML and code shows a Ribbon with a functional toggle > button that will show or hide a Test Button 1 control: > > <?xml version="1.0" encoding="UTF-8" standalone="yes"?> > <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" > onLoad="Onload"> > <ribbon> > <tabs> > <tab id="CustomTab" label="My Tab"> > <group id="SampleGroup" label="Sample Group"> > <toggleButton id="myTB1" size="large" getLabel="GetLabel" > getPressed="GetPressed" getImage="GetImage" onAction="MyActionMacro"/> > <button id="myTestButton1" label="Test Button 1" getVisible="GetVisible"/> > </group> > </tab> > </tabs> > </ribbon> > </customUI> > > > Option Explicit > Public myRibbon As IRibbonUI > Private bState As Boolean > Sub Onload(ribbon As IRibbonUI) > Set myRibbon = ribbon > bState = True 'Set initial state of toggle button (condition, label, image) > End Sub > > Sub GetImage(control As IRibbonControl, ByRef image) > Select Case control.ID > Case "myTB1" > If bState Then > image = "FileOpen" > Else > image = "FileClose" > End If > Case Else > 'Do Nothing > End Select > End Sub > > Sub GetPressed(control As IRibbonControl, ByRef state) > If bState Then > state = False 'Not depressed > Else > state = True 'Depressed > End If > 'You can use the GetPressed callback to perform simple toggle actions e.g.,: > If Selection.Font.Size = 12 Then > Selection.Font.Size = 6 > Else > Selection.Font.Size = 12 > End If > End Sub > > Sub MyActionMacro(ByVal control As IRibbonControl, pressed As Boolean) > 'pressed is true if the toggle is clicked while in the "not depressed" > state. > If pressed Then > bState = False > MsgBox "The folder is shutting" > Selection.Font.Color = wdColorRed > Else > bState = True > MsgBox "The folder is opening" > Selection.Font.Color = wdColorAutomatic > End If > myRibbon.Invalidate > End Sub > > Sub getLabel(ByVal control As IRibbonControl, ByRef label) > Select Case control.ID > Case "myTB1" > Select Case bState > Case True > label = "Open" > Case Else > label = "Shut" > End Select > Case Else > 'Do nothing > End Select > End Sub > > Sub GetVisible(ByVal control As IRibbonControl, ByRef returnedVal) > Select Case control.ID > Case "myTestButton1" > If bState Then > returnedVal = True > Else > returnedVal = False > End If > End Select > End Sub > > Neil Humphries wrote: > > I have resolved the appearance & labelling of the toggle button. I > > needed to change the onAction callback to pressed as boolean rather > > then ByRef pressed or ByVal pressed, then clean up the togglestate > > logic. > > > > That leaves me with wanting to use the togglestate of this button to > > control the visibility of other controls in the same group. How do I > > iterate through the other controls and can I manipulate the visible > > attribute directly or do I have to use > > getVisible in the XML for the control? > > > > > > "Neil Humphries" wrote: > > > >> I must be missing something basic. I am trying to program a > >> togglebutton to change labels based on whether it is pressed or not, > >> but can't get it to work. As long as MyRibbon is valid, nothing > >> changes. If because of editting VBA MyRibbon becomes invalid the > >> button shows its toggled state. This is the code I am using: > >> > >> 'Callback for tButMAXAdmin00 onAction > >> Sub MinimizeMaxAdminRFPBar(control As IRibbonControl, ByVal pressed) > >> MyPressed = pressed > >> If (Not MyRibbon Is Nothing) Then > >> MyRibbon.InvalidateControl ("tButMAXAdmin00") > >> End If > >> End Sub > >> > >> Sub getVisible(control As IRibbonControl, ByRef visible) > >> MyTag = "TDRFP" > >> 'if max/min button pressed > >> If control.Tag = "show" Then > >> visible = True > >> 'toggle visibility of other controls in same group > >> If control.Tag Like MyTag Then > >> visible = Not (visible) > >> End If > >> End If > >> End Sub > >> > >> Sub getLabel(control As IRibbonControl, ByRef label) > >> Select Case control.ID > >> Case Is = "cButMAXAdmin99" > >> 'this doesn't work because label is undefined when > >> passed ByRef If label = "Minimize Group" Then > >> label = "Maximize Group" > >> Else > >> label = "Minimize Group" > >> End If > >> Case Is = "tButMAXAdmin00" > >> If MyPressed Then > >> label = "Maximize Group" > >> Else > >> label = "Minimize Group" > >> End If > >> Case Else > >> 'do nothing > >> End Select > >> End Sub > >> > >> Sub getPressed(control As IRibbonControl, ByRef toggleState) > >> Select Case control.ID > >> Case Is = "tButMAXAdmin00" > >> MyPressed = Not (MyPressed) > >> Case Else > >> 'do nothing > >> End Select > >> toggleState = MyPressed > >> End Sub > >> > >> If I want to use the togglestate of this button to control the > >> visibility of other controls in the same group, how do I iterate > >> through the other controls and can I manipulate the visible > >> attribute directly or do I have to use getVisible in the XML for the > >> control? > > -- > Greg Maxey > > See my web site http://gregmaxey.mvps.org > for an eclectic collection of Word Tips. > > "It is not the critic who counts, not the man who points out how the > strong man stumbles, or where the doer of deeds could have done them > better. The credit belongs to the man in the arena, whose face is > marred by dust and sweat and blood, who strives valiantly...who knows > the great enthusiasms, the great devotions, who spends himself in a > worthy cause, who at the best knows in the end the triumph of high > achievement, and who at the worst, if he fails, at least fails while > daring greatly, so that his place shall never be with those cold and > timid souls who have never known neither victory nor defeat." - TR > > > >
From: Greg Maxey on 9 Oct 2009 17:55 Neil, I don't think you can ivalidate a group and all its controls with one statement. You can invalidate all of the controls in a group which would probably be better than invalidating the entire ribbon. Something like this: Dim arrControls() As String Dim i As Long arrControls = Split("myTB1|myTestButton1|myTestButton2", "|") '** the controls in a group For i = 0 To UBound(arrControls) myRibbon.InvalidateControl (arrControls(i)) Next i According to documentatin the separator is "supposed" to take a static and dynamic "visible" attribute. However, it doesn't work and must be a bug. Neil Humphries wrote: > That is what I needed. Thanks. > > Is it possible or advantageous to invalidate a group and all it's > controls rather than the whole ribbon? > > I filter what is toggled by the tag property however I just > discovered that separators don't have a tag property. That seems odd > and will force more convoluted logic to control their visibility. > > Sub getVisible(control As IRibbonControl, ByRef visible) > MyTag = "TDRFP" > If MyPressed Then > If control.Tag Like MyTag Then > visible = False > ElseIf control.Tag = "show" Then > visible = True > End If > Debug.Print "Control id is like ", control.ID > If control.ID Like "SepMaxAdmin" Then > visible = False > End If > Else > visible = True > End If > End Sub > > My separators have ID's of SepMaxAdmin2 and SepMaxAdmin3. > <separator id="SepMaxAdmin2" getVisible="getVisible" /> > <separator id="SepMaxAdmin3" getVisible="getVisible" /> > > The following code has no effect on their visibility: > If control.ID Like "SepMaxAdmin" Then > visible = False > End If > > Any suggestions? > > "Greg Maxey" wrote: > >> Neil, >> >> I can't say this is the only way, but the way I do it is to >> invalidate the ribbon. The following XML and code shows a Ribbon >> with a functional toggle button that will show or hide a Test Button >> 1 control: >> >> <?xml version="1.0" encoding="UTF-8" standalone="yes"?> >> <customUI >> xmlns="http://schemas.microsoft.com/office/2006/01/customui" >> onLoad="Onload"> <ribbon> >> <tabs> >> <tab id="CustomTab" label="My Tab"> >> <group id="SampleGroup" label="Sample Group"> >> <toggleButton id="myTB1" size="large" getLabel="GetLabel" >> getPressed="GetPressed" getImage="GetImage" >> onAction="MyActionMacro"/> <button id="myTestButton1" label="Test >> Button 1" getVisible="GetVisible"/> </group> >> </tab> >> </tabs> >> </ribbon> >> </customUI> >> >> >> Option Explicit >> Public myRibbon As IRibbonUI >> Private bState As Boolean >> Sub Onload(ribbon As IRibbonUI) >> Set myRibbon = ribbon >> bState = True 'Set initial state of toggle button (condition, label, >> image) End Sub >> >> Sub GetImage(control As IRibbonControl, ByRef image) >> Select Case control.ID >> Case "myTB1" >> If bState Then >> image = "FileOpen" >> Else >> image = "FileClose" >> End If >> Case Else >> 'Do Nothing >> End Select >> End Sub >> >> Sub GetPressed(control As IRibbonControl, ByRef state) >> If bState Then >> state = False 'Not depressed >> Else >> state = True 'Depressed >> End If >> 'You can use the GetPressed callback to perform simple toggle >> actions e.g.,: If Selection.Font.Size = 12 Then >> Selection.Font.Size = 6 >> Else >> Selection.Font.Size = 12 >> End If >> End Sub >> >> Sub MyActionMacro(ByVal control As IRibbonControl, pressed As >> Boolean) 'pressed is true if the toggle is clicked while in the "not >> depressed" state. >> If pressed Then >> bState = False >> MsgBox "The folder is shutting" >> Selection.Font.Color = wdColorRed >> Else >> bState = True >> MsgBox "The folder is opening" >> Selection.Font.Color = wdColorAutomatic >> End If >> myRibbon.Invalidate >> End Sub >> >> Sub getLabel(ByVal control As IRibbonControl, ByRef label) >> Select Case control.ID >> Case "myTB1" >> Select Case bState >> Case True >> label = "Open" >> Case Else >> label = "Shut" >> End Select >> Case Else >> 'Do nothing >> End Select >> End Sub >> >> Sub GetVisible(ByVal control As IRibbonControl, ByRef returnedVal) >> Select Case control.ID >> Case "myTestButton1" >> If bState Then >> returnedVal = True >> Else >> returnedVal = False >> End If >> End Select >> End Sub >> >> Neil Humphries wrote: >>> I have resolved the appearance & labelling of the toggle button. I >>> needed to change the onAction callback to pressed as boolean rather >>> then ByRef pressed or ByVal pressed, then clean up the togglestate >>> logic. >>> >>> That leaves me with wanting to use the togglestate of this button to >>> control the visibility of other controls in the same group. How do I >>> iterate through the other controls and can I manipulate the visible >>> attribute directly or do I have to use >>> getVisible in the XML for the control? >>> >>> >>> "Neil Humphries" wrote: >>> >>>> I must be missing something basic. I am trying to program a >>>> togglebutton to change labels based on whether it is pressed or >>>> not, but can't get it to work. As long as MyRibbon is valid, >>>> nothing changes. If because of editting VBA MyRibbon becomes >>>> invalid the button shows its toggled state. This is the code I am >>>> using: >>>> >>>> 'Callback for tButMAXAdmin00 onAction >>>> Sub MinimizeMaxAdminRFPBar(control As IRibbonControl, ByVal >>>> pressed) MyPressed = pressed >>>> If (Not MyRibbon Is Nothing) Then >>>> MyRibbon.InvalidateControl ("tButMAXAdmin00") >>>> End If >>>> End Sub >>>> >>>> Sub getVisible(control As IRibbonControl, ByRef visible) >>>> MyTag = "TDRFP" >>>> 'if max/min button pressed >>>> If control.Tag = "show" Then >>>> visible = True >>>> 'toggle visibility of other controls in same group >>>> If control.Tag Like MyTag Then >>>> visible = Not (visible) >>>> End If >>>> End If >>>> End Sub >>>> >>>> Sub getLabel(control As IRibbonControl, ByRef label) >>>> Select Case control.ID >>>> Case Is = "cButMAXAdmin99" >>>> 'this doesn't work because label is undefined when >>>> passed ByRef If label = "Minimize Group" Then >>>> label = "Maximize Group" >>>> Else >>>> label = "Minimize Group" >>>> End If >>>> Case Is = "tButMAXAdmin00" >>>> If MyPressed Then >>>> label = "Maximize Group" >>>> Else >>>> label = "Minimize Group" >>>> End If >>>> Case Else >>>> 'do nothing >>>> End Select >>>> End Sub >>>> >>>> Sub getPressed(control As IRibbonControl, ByRef toggleState) >>>> Select Case control.ID >>>> Case Is = "tButMAXAdmin00" >>>> MyPressed = Not (MyPressed) >>>> Case Else >>>> 'do nothing >>>> End Select >>>> toggleState = MyPressed >>>> End Sub >>>> >>>> If I want to use the togglestate of this button to control the >>>> visibility of other controls in the same group, how do I iterate >>>> through the other controls and can I manipulate the visible >>>> attribute directly or do I have to use getVisible in the XML for >>>> the control? >> >> -- >> Greg Maxey >> >> See my web site http://gregmaxey.mvps.org >> for an eclectic collection of Word Tips. >> >> "It is not the critic who counts, not the man who points out how the >> strong man stumbles, or where the doer of deeds could have done them >> better. The credit belongs to the man in the arena, whose face is >> marred by dust and sweat and blood, who strives valiantly...who knows >> the great enthusiasms, the great devotions, who spends himself in a >> worthy cause, who at the best knows in the end the triumph of high >> achievement, and who at the worst, if he fails, at least fails while >> daring greatly, so that his place shall never be with those cold and >> timid souls who have never known neither victory nor defeat." - TR -- Greg Maxey See my web site http://gregmaxey.mvps.org for an eclectic collection of Word Tips. "It is not the critic who counts, not the man who points out how the strong man stumbles, or where the doer of deeds could have done them better. The credit belongs to the man in the arena, whose face is marred by dust and sweat and blood, who strives valiantly...who knows the great enthusiasms, the great devotions, who spends himself in a worthy cause, who at the best knows in the end the triumph of high achievement, and who at the worst, if he fails, at least fails while daring greatly, so that his place shall never be with those cold and timid souls who have never known neither victory nor defeat." - TR
|
Next
|
Last
Pages: 1 2 Prev: Print Preview Doesn't Trigger BeforePrint Event Next: Copying TextBox text |