Can't toggle togglebutton on ribbon

N

Neil Humphries

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?
 
N

Neil Humphries

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?
 
G

Greg Maxey

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 said:
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?

--
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
 
N

Neil Humphries

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?
 
G

Greg Maxey

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 said:
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

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
 
N

Neil Humphries

Thank you again for your help.

"When computers (hardware and software) are as reliable as a hammer, then
they will be tools and not toys"
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top