* Fixed radiogroup menuitems

git-svn-id: trunk@4414 -
This commit is contained in:
marc 2003-07-21 23:43:32 +00:00
parent 0ba12a0f29
commit 73d6dcef82
9 changed files with 295 additions and 91 deletions

View File

@ -8,13 +8,13 @@ object DebuggerOptionsForm: TDebuggerOptionsForm
POSITION = podefaultposonly
HORZSCROLLBAR.PAGE = 481
VERTSCROLLBAR.PAGE = 443
LEFT = 523
LEFT = 515
HEIGHT = 442
TOP = 319
TOP = 247
WIDTH = 480
object nbDebugOptions: TNOTEBOOK
ALIGN = altop
PAGEINDEX = 2
PAGEINDEX = 3
HEIGHT = 398
WIDTH = 480
object pgGeneral: TPAGE
@ -149,10 +149,10 @@ object DebuggerOptionsForm: TDebuggerOptionsForm
end
object seLimitLinecount: TSPINEDIT
ENABLED = False
CLIMB_RATE = 7.62096543442854E-34
MINVALUE = 7.62096543442854E-34
MAXVALUE = 7.62096543442854E-34
VALUE = 7.62096543442854E-34
CLIMB_RATE = 7.22976091447488E-34
MINVALUE = 7.22976091447488E-34
MAXVALUE = 7.22976091447488E-34
VALUE = 7.22976091447488E-34
LEFT = 28
HEIGHT = 20
TOP = 53
@ -358,16 +358,6 @@ object DebuggerOptionsForm: TDebuggerOptionsForm
end
object lvSignals: TLISTVIEW
COLUMNS = <
item
CAPTION = 'Handled by'
VISIBLE = True
WIDTH = 75
end
item
CAPTION = 'Resume'
VISIBLE = True
WIDTH = 75
end
item
CAPTION = 'Name'
VISIBLE = True
@ -377,6 +367,16 @@ object DebuggerOptionsForm: TDebuggerOptionsForm
CAPTION = 'ID'
VISIBLE = True
WIDTH = 50
end
item
CAPTION = 'Handled by'
VISIBLE = True
WIDTH = 75
end
item
CAPTION = 'Resume'
VISIBLE = True
WIDTH = 75
end>
POPUPMENU = popSignal
VIEWSTYLE = vsreport
@ -415,22 +415,30 @@ object DebuggerOptionsForm: TDebuggerOptionsForm
left = 408
top = 20
object mnuHandledByProgram: TMENUITEM
AUTOCHECK = True
CAPTION = 'Handled by Program'
GROUPINDEX = 1
RADIOITEM = True
end
object mnuiHandledByDebugger: TMENUITEM
AUTOCHECK = True
CAPTION = 'Handled by Debugger'
GROUPINDEX = 1
RADIOITEM = True
end
object N1: TMENUITEM
CAPTION = '-'
end
object mnuResumeHandled: TMENUITEM
AUTOCHECK = True
CAPTION = 'Resume Handled'
GROUPINDEX = 2
RADIOITEM = True
end
object mnuResumeUnhandled: TMENUITEM
AUTOCHECK = True
CAPTION = 'Resume Unhandled'
GROUPINDEX = 2
RADIOITEM = True
end
end

View File

@ -5,11 +5,11 @@ LazarusResources.Add('TDebuggerOptionsForm','FORMDATA',[
+'sdialog'#7'CAPTION'#6#16'Debugger Options'#12'CLIENTHEIGHT'#3#186#1#11'CLIE'
+'NTWIDTH'#3#224#1#8'ONCREATE'#7#25'DebuggerOptionsFormCREATE'#9'ONDESTROY'#7
+#26'DebuggerOptionsFormDESTROY'#8'POSITION'#7#16'podefaultposonly'#18'HORZSC'
+'ROLLBAR.PAGE'#3#225#1#18'VERTSCROLLBAR.PAGE'#3#187#1#4'LEFT'#3#11#2#6'HEIGH'
+'T'#3#186#1#3'TOP'#3'?'#1#5'WIDTH'#3#224#1#0#9'TNOTEBOOK'#14'nbDebugOptions'
+#5'ALIGN'#7#5'altop'#9'PAGEINDEX'#2#2#6'HEIGHT'#3#142#1#5'WIDTH'#3#224#1#0#5
+'TPAGE'#9'pgGeneral'#7'CAPTION'#6#7'General'#11'CLIENTWIDTH'#3#220#1#12'CLIE'
+'NTHEIGHT'#3'p'#1#4'LEFT'#2#2#6'HEIGHT'#3'p'#1#3'TOP'#2#28#5'WIDTH'#3#220#1#0
+'ROLLBAR.PAGE'#3#225#1#18'VERTSCROLLBAR.PAGE'#3#187#1#4'LEFT'#3#3#2#6'HEIGHT'
+#3#186#1#3'TOP'#3#247#0#5'WIDTH'#3#224#1#0#9'TNOTEBOOK'#14'nbDebugOptions'#5
+'ALIGN'#7#5'altop'#9'PAGEINDEX'#2#3#6'HEIGHT'#3#142#1#5'WIDTH'#3#224#1#0#5'T'
+'PAGE'#9'pgGeneral'#7'CAPTION'#6#7'General'#11'CLIENTWIDTH'#3#220#1#12'CLIEN'
+'THEIGHT'#3'p'#1#4'LEFT'#2#2#6'HEIGHT'#3'p'#1#3'TOP'#2#28#5'WIDTH'#3#220#1#0
+#9'TGROUPBOX'#14'gbDebuggerType'#7'CAPTION'#6#22'Debugger type and path'#12
+'CLIENTHEIGHT'#2'%'#11'CLIENTWIDTH'#3#212#1#11'PARENTCTL3D'#8#8'TABORDER'#2#0
+#4'LEFT'#2#2#6'HEIGHT'#2'6'#3'TOP'#2#8#5'WIDTH'#3#216#1#0#9'TCOMBOBOX'#15'cm'
@ -39,9 +39,9 @@ LazarusResources.Add('TDebuggerOptionsForm','FORMDATA',[
+'CHECKBOX'#17'chkLimitLinecount'#11'ALLOWGRAYED'#9#8'AUTOSIZE'#9#7'CAPTION'#6
+#18'Limit linecount to'#10'DRAGCURSOR'#2#0#8'TABORDER'#2#1#7'TABSTOP'#9#4'LE'
+'FT'#2#4#6'HEIGHT'#2#20#3'TOP'#2#29#5'WIDTH'#2'w'#0#0#9'TSPINEDIT'#16'seLimi'
+'tLinecount'#7'ENABLED'#8#10'CLIMB_RATE'#5#0#0#0#0#0#1'@'#253#144'?'#8'MINVA'
+'LUE'#5#0#0#0#0#0#1'@'#253#144'?'#8'MAXVALUE'#5#0#0#0#0#0#1'@'#253#144'?'#5
+'VALUE'#5#0#0#0#0#0#1'@'#253#144'?'#4'LEFT'#2#28#6'HEIGHT'#2#20#3'TOP'#2'5'#5
+'tLinecount'#7'ENABLED'#8#10'CLIMB_RATE'#5#0#0#0#0#0#1'@'#240#144'?'#8'MINVA'
+'LUE'#5#0#0#0#0#0#1'@'#240#144'?'#8'MAXVALUE'#5#0#0#0#0#0#1'@'#240#144'?'#5
+'VALUE'#5#0#0#0#0#0#1'@'#240#144'?'#4'LEFT'#2#28#6'HEIGHT'#2#20#3'TOP'#2'5'#5
+'WIDTH'#2'>'#0#0#0#9'TGROUPBOX'#10'gbMessages'#7'CAPTION'#6#8'Messages'#12'C'
+'LIENTHEIGHT'#3#171#0#11'CLIENTWIDTH'#3#228#0#7'ENABLED'#8#11'PARENTCTL3D'#8
+#8'TABORDER'#2#1#4'LEFT'#3#242#0#6'HEIGHT'#3#188#0#3'TOP'#2#8#5'WIDTH'#3#232
@ -88,20 +88,22 @@ LazarusResources.Add('TDebuggerOptionsForm','FORMDATA',[
+'TABORDER'#2#0#4'LEFT'#3'}'#1#6'HEIGHT'#2#25#3'TOP'#3'1'#1#5'WIDTH'#2'K'#0#0
+#7'TBUTTON'#12'cmdSignalAdd'#7'CAPTION'#6#3'Add'#7'TABSTOP'#9#8'TABORDER'#2#1
+#4'LEFT'#3'('#1#6'HEIGHT'#2#25#3'TOP'#3'1'#1#5'WIDTH'#2'K'#0#0#9'TLISTVIEW'#9
+'lvSignals'#7'COLUMNS'#14#1#7'CAPTION'#6#10'Handled by'#7'VISIBLE'#9#5'WIDTH'
+#2'K'#0#1#7'CAPTION'#6#6'Resume'#7'VISIBLE'#9#5'WIDTH'#2'K'#0#1#7'CAPTION'#6
+#4'Name'#7'VISIBLE'#9#5'WIDTH'#3#200#0#0#1#7'CAPTION'#6#2'ID'#7'VISIBLE'#9#5
+'WIDTH'#2'2'#0#0#9'POPUPMENU'#7#9'popSignal'#9'VIEWSTYLE'#7#8'vsreport'#4'LE'
+'FT'#2#8#6'HEIGHT'#3'$'#1#3'TOP'#2#5#5'WIDTH'#3#192#1#0#0#0#0#0#7'TBUTTON'#9
+'cmdCancel'#11'MODALRESULT'#2#2#6'CANCEL'#9#7'CAPTION'#6#6'Cancel'#7'TABSTOP'
+#9#8'TABORDER'#2#1#4'LEFT'#3#144#1#6'HEIGHT'#2#25#3'TOP'#3#152#1#5'WIDTH'#2
+'K'#0#0#7'TBUTTON'#5'cmdOK'#7'DEFAULT'#9#11'MODALRESULT'#2#1#7'CAPTION'#6#2
+'lvSignals'#7'COLUMNS'#14#1#7'CAPTION'#6#4'Name'#7'VISIBLE'#9#5'WIDTH'#3#200
+#0#0#1#7'CAPTION'#6#2'ID'#7'VISIBLE'#9#5'WIDTH'#2'2'#0#1#7'CAPTION'#6#10'Han'
+'dled by'#7'VISIBLE'#9#5'WIDTH'#2'K'#0#1#7'CAPTION'#6#6'Resume'#7'VISIBLE'#9
+#5'WIDTH'#2'K'#0#0#9'POPUPMENU'#7#9'popSignal'#9'VIEWSTYLE'#7#8'vsreport'#4
+'LEFT'#2#8#6'HEIGHT'#3'$'#1#3'TOP'#2#5#5'WIDTH'#3#192#1#0#0#0#0#0#7'TBUTTON'
+#9'cmdCancel'#11'MODALRESULT'#2#2#6'CANCEL'#9#7'CAPTION'#6#6'Cancel'#7'TABST'
+'OP'#9#8'TABORDER'#2#1#4'LEFT'#3#144#1#6'HEIGHT'#2#25#3'TOP'#3#152#1#5'WIDTH'
+#2'K'#0#0#7'TBUTTON'#5'cmdOK'#7'DEFAULT'#9#11'MODALRESULT'#2#1#7'CAPTION'#6#2
+'OK'#7'TABSTOP'#9#8'TABORDER'#2#2#7'ONCLICK'#7#10'cmdOKCLICK'#4'LEFT'#3'@'#1
+#6'HEIGHT'#2#25#3'TOP'#3#152#1#5'WIDTH'#2'K'#0#0#10'TPOPUPMENU'#9'popSignal'
+#4'left'#3#152#1#3'top'#2#20#0#9'TMENUITEM'#19'mnuHandledByProgram'#7'CAPTIO'
+'N'#6#18'Handled by Program'#9'RADIOITEM'#9#0#0#9'TMENUITEM'#21'mnuiHandledB'
+'yDebugger'#7'CAPTION'#6#19'Handled by Debugger'#9'RADIOITEM'#9#0#0#9'TMENUI'
+'TEM'#2'N1'#7'CAPTION'#6#1'-'#0#0#9'TMENUITEM'#16'mnuResumeHandled'#7'CAPTIO'
+'N'#6#14'Resume Handled'#9'RADIOITEM'#9#0#0#9'TMENUITEM'#18'mnuResumeUnhandl'
+'ed'#7'CAPTION'#6#16'Resume Unhandled'#9'RADIOITEM'#9#0#0#0#0
+#4'left'#3#152#1#3'top'#2#20#0#9'TMENUITEM'#19'mnuHandledByProgram'#9'AUTOCH'
+'ECK'#9#7'CAPTION'#6#18'Handled by Program'#10'GROUPINDEX'#2#1#9'RADIOITEM'#9
+#0#0#9'TMENUITEM'#21'mnuiHandledByDebugger'#9'AUTOCHECK'#9#7'CAPTION'#6#19'H'
+'andled by Debugger'#10'GROUPINDEX'#2#1#9'RADIOITEM'#9#0#0#9'TMENUITEM'#2'N1'
+#7'CAPTION'#6#1'-'#0#0#9'TMENUITEM'#16'mnuResumeHandled'#9'AUTOCHECK'#9#7'CA'
+'PTION'#6#14'Resume Handled'#10'GROUPINDEX'#2#2#9'RADIOITEM'#9#0#0#9'TMENUIT'
+'EM'#18'mnuResumeUnhandled'#9'AUTOCHECK'#9#7'CAPTION'#6#16'Resume Unhandled'
+#10'GROUPINDEX'#2#2#9'RADIOITEM'#9#0#0#0#0
]);

View File

@ -62,6 +62,7 @@ type
private
FExceptionDeleteList: TStringList;
procedure AddExceptionLine(const AException: TIDEException; AName: String);
procedure AddSignalLine(const ASignal: TIDESignal);
public
end;
@ -70,6 +71,10 @@ var
implementation
const
HANDLEDBY_CAPTION: array [Boolean] of String = ('Program', 'Debugger');
RESUME_CAPTION: array[Boolean] of String = ('Unhandled', 'Handled');
{ TDebuggerOptionsForm }
procedure TDebuggerOptionsForm.AddExceptionLine(const AException: TIDEException; AName: String);
@ -84,6 +89,18 @@ begin
clbExceptions.Checked[idx] := (AException = nil) or AException.Enabled;
end;
procedure TDebuggerOptionsForm.AddSignalLine(const ASignal: TIDESignal);
var
Item: TListItem;
begin
Item := lvSignals.Items.Add;
Item.Caption := ASignal.Name;
Item.SubItems.Add(IntToStr(ASignal.ID));
Item.SubItems.Add(HANDLEDBY_CAPTION[ASignal.HandledByDebugger]);
Item.SubItems.Add(RESUME_CAPTION[ASignal.ResumeHandled]);
Item.Data := ASignal;
end;
procedure TDebuggerOptionsForm.clbExceptionsCLICK (Sender: TObject );
begin
cmdExceptionRemove.Enabled := clbExceptions.ItemIndex <> -1;
@ -169,6 +186,12 @@ begin
begin
AddExceptionLine(DebugBoss.Exceptions[n], '');
end;
for n := 0 to DebugBoss.Signals.Count - 1 do
begin
AddSignalLine(DebugBoss.Signals[n]);
end;
end;
procedure TDebuggerOptionsForm.DebuggerOptionsFormDESTROY(Sender: TObject);

View File

@ -52,7 +52,11 @@ begin
if (not Assigned(ActionLink) and AutoCheck) or (Assigned(ActionLink) and
not (ActionLink.IsAutoCheckLinked) and AutoCheck)
then
Checked := not Checked;
// Break a little Delphi compatibility
// It makes no sense to uncheck a checked RadioItem (besides, GTK cant handle it)
if not RadioItem or not Checked
then Checked := not Checked;
{ Call OnClick if assigned and not equal to associated action's OnExecute.
If associated action's OnExecute assigned then call it, otherwise, call
OnClick. }
@ -487,18 +491,24 @@ begin
if FItems = nil then FItems := TList.Create;
// adjust GroupIndex
(*
* MWE: Disabled this feature, it makes not much sense
* suppose a menu with items grouped like : G=2, G=2, ---, G=1, G=1
* where --- is separator with G=0
* Inserting G=1 after --- is OK according to the next check
if (Index>0) and (Index < FItems.Count) then
if Item.GroupIndex < TMenuItem(FItems[Index - 1]).GroupIndex then
Item.GroupIndex := TMenuItem(FItems[Index - 1]).GroupIndex;
VerifyGroupIndex(Index, Item.GroupIndex);
*)
Item.FParent := Self;
Item.FOnChange := @SubItemChanged;
FItems.Insert(Index, Item);
if HandleAllocated then begin
Item.HandleNeeded;
//InterfaceObject.IntSendMessage3(LM_ATTACHMENU, Item, nil);
end;
MenuChanged(FItems.Count = 1);
end;
@ -822,8 +832,12 @@ procedure TMenuItem.SetGroupIndex(AValue: Byte);
begin
if FGroupIndex <> AValue then
begin
(*
* MWE: Disabled this feature, it makes not much sense
* See other comments
if Parent <> nil then
Parent.VerifyGroupIndex(Parent.IndexOf(Self), AValue);
*)
FGroupIndex := AValue;
if FChecked and FRadioItem then
TurnSiblingsOff;
@ -914,6 +928,9 @@ end;
Unchecks all siblings.
In contrary to Delphi this will not use SetChecked, because this is up to the
interface. This procedure just sets the private variables.
//todo
MWE: ??? shouln'd we get checked from the interface in that case ???
------------------------------------------------------------------------------}
procedure TMenuItem.TurnSiblingsOff;
var
@ -925,11 +942,12 @@ begin
begin
Item := FParent[I];
if (Item <> Self)
and Item.FRadioItem and (Item.GroupIndex = GroupIndex) then
Item.FChecked:=false;
and Item.FRadioItem and (Item.GroupIndex = GroupIndex)
then Item.FChecked := false;
end;
end;
{------------------------------------------------------------------------------
Method: TMenuItem.VerifyGroupIndex
Params: Position: Integer; Value: Byte
@ -937,6 +955,12 @@ end;
Make sure, that all GroupIndex are in ascending order.
------------------------------------------------------------------------------}
(*
* MWE: Disabled this feature, it makes not much sense
* suppose a menu with items grouped like : G=1, G=1, ---, G=2, G=2
* where --- is separator with G=0
* It will fail to insert ---
procedure TMenuItem.VerifyGroupIndex(Position: Integer; Value: Byte);
var
i: Integer;
@ -951,6 +975,7 @@ begin
if (Items[i].GroupIndex<>0) and (Items[i].GroupIndex<Value) then
Items[i].FGroupIndex:=Value;
end;
*)
// included by menus.pp
@ -958,6 +983,9 @@ end;
{ =============================================================================
$Log$
Revision 1.38 2003/07/21 23:43:32 marc
* Fixed radiogroup menuitems
Revision 1.37 2003/07/01 09:29:51 mattias
attaching menuitems topdown
@ -1097,6 +1125,9 @@ end;
$Log$
Revision 1.38 2003/07/21 23:43:32 marc
* Fixed radiogroup menuitems
Revision 1.37 2003/07/01 09:29:51 mattias
attaching menuitems topdown

View File

@ -280,29 +280,11 @@ end;
function gtkactivateCB(widget: PGtkWidget; data: gPointer) : GBoolean; cdecl;
var
Mess : TLMessage;
LCLMenuItem: TMenuItem;
begin
Result:= True;
EventTrace('activate', data);
if LockOnChange(PgtkObject(Widget),0)>0 then exit;
if GtkWidgetIsA(widget,GTK_TYPE_MENU_ITEM) then begin
LCLMenuItem:=TMenuItem(GetLCLObject(Widget));
if (LCLMenuItem<>nil) and LCLMenuItem.IsCheckItem
and (GtkWidgetIsA(widget,GTK_TYPE_CHECK_MENU_ITEM)) then begin
if ((PGtkCheckMenuItem(Widget)^.flag0 and bm_checkmenuitem_active)<>0)
<>LCLMenuItem.Checked
then begin
if (not LCLMenuItem.AutoCheck) then begin
// the gtk always toggles the check flag
// -> restore 'checked' flag
PGtkCheckMenuItem(Widget)^.flag0:=
PGtkCheckMenuItem(Widget)^.flag0 xor bm_checkmenuitem_active;
end;
end;
end;
end;
if LockOnChange(PgtkObject(Widget),0) > 0 then Exit;
Mess.Msg := LM_ACTIVATE;
Mess.Result := 0;
@ -310,6 +292,30 @@ begin
//writeln('gtkactivateCB ',Result);
end;
function GTKCheckMenuToggeledCB(AMenuItem: PGTKCheckMenuItem; AData: gPointer): GBoolean; cdecl;
// AData --> LCLMenuItem
var
LCLMenuItem: TMenuItem;
begin
Result := True;
EventTrace('toggled', AData);
LCLMenuItem := TMenuItem(AData);
// some sanity checks
if LCLMenuItem = nil then Exit;
if not LCLMenuItem.IsCheckItem then Exit; // ???
// the gtk always toggles the check flag
// -> restore 'checked' flag if needed
if (AMenuItem^.flag0 and bm_checkmenuitem_active <> 0) = LCLMenuItem.Checked then Exit;
if LCLMenuItem.AutoCheck then Exit;
// restore it
LockOnChange(PgtkObject(AMenuItem), +1);
gtk_check_menu_item_set_active(AMenuItem, LCLMenuItem.Checked);
LockOnChange(PgtkObject(AMenuItem), -1);
end;
function gtkchangedCB( widget: PGtkWidget; data: gPointer) : GBoolean; cdecl;
var
Mess : TLMessage;
@ -2781,6 +2787,9 @@ end;
{ =============================================================================
$Log$
Revision 1.183 2003/07/21 23:43:32 marc
* Fixed radiogroup menuitems
Revision 1.182 2002/08/17 23:41:34 mattias
many clipping fixes

View File

@ -2587,6 +2587,21 @@ begin
Result:=GetRadioMenuItemGroup(TMenuItem(GetLCLObject(MenuItem)));
end;
{------------------------------------------------------------------------------
procedure LockRadioGroupOnChange(RadioGroup: PGSList; const ADelta: Integer);
Calls LockOnChange for all groupmembers
------------------------------------------------------------------------------}
procedure LockRadioGroupOnChange(RadioGroup: PGSList; const ADelta: Integer);
begin
while RadioGroup <> nil do
begin
if RadioGroup^.Data <> nil
then LockOnChange(PgtkObject(RadioGroup^.Data), ADelta);
RadioGroup := RadioGroup^.Next;
end;
end;
{------------------------------------------------------------------------------
procedure UpdateRadioGroupChecks(RadioGroup: PGSList);
@ -2595,35 +2610,33 @@ end;
procedure UpdateRadioGroupChecks(RadioGroup: PGSList);
var
CurListItem: PGSList;
MenuItem: PGtkMenuItem;
MenuItem: PGtkCheckMenuItem;
LCLMenuItem: TMenuItem;
begin
if RadioGroup=nil then exit;
CurListItem:=RadioGroup;
// set active radiomenuitem
while CurListItem<>nil do begin
MenuItem:=PGtkMenuItem(CurListItem^.Data);
if MenuItem<>nil then begin
LCLMenuItem:=TMenuItem(GetLCLObject(MenuItem));
if (LCLMenuItem<>nil) and LCLMenuItem.Checked then begin
gtk_check_menu_item_set_active(PGtkCheckMenuItem(MenuItem),
LCLMenuItem.Checked);
// Check if it is a single entry
if (RadioGroup = nil) or (RadioGroup^.Next = nil)
then Exit;
// Lock whole group for update
LockRadioGroupOnChange(RadioGroup, +1);
CurListItem := RadioGroup;
try
// set active radiomenuitem
while CurListItem <> nil do
begin
MenuItem := PGtkCheckMenuItem(CurListItem^.Data);
if MenuItem<>nil
then begin
LCLMenuItem := TMenuItem(GetLCLObject(MenuItem));
if (LCLMenuItem <> nil)
and (((MenuItem^.flag0 and bm_checkmenuitem_active) = 0) = LCLMenuItem.Checked)
then gtk_check_menu_item_set_active(MenuItem, LCLMenuItem.Checked);
end;
CurListItem := CurListItem^.Next;
end;
CurListItem:=CurListItem^.Next;
end;
CurListItem:=RadioGroup;
// deactivate the other radiomenuitems
while CurListItem<>nil do begin
MenuItem:=PGtkMenuItem(CurListItem^.Data);
if MenuItem<>nil then begin
LCLMenuItem:=TMenuItem(GetLCLObject(MenuItem));
if (LCLMenuItem<>nil) then begin
gtk_check_menu_item_set_active(PGtkCheckMenuItem(MenuItem),
LCLMenuItem.Checked);
end;
end;
CurListItem:=CurListItem^.Next;
finally
// Unlock whole group for update
LockRadioGroupOnChange(RadioGroup, -1);
end;
end;
@ -2867,6 +2880,7 @@ begin
MenuItemWidget:=gtk_check_menu_item_new;
end else
MenuItemWidget:=gtk_menu_item_new;
if GtkWidgetIsA(MenuItemWidget,GTK_TYPE_CHECK_MENU_ITEM) then begin
// set 'ShowAlwaysCheckable'
gtk_check_menu_item_set_show_toggle(PGtkCheckMenuItem(MenuItemWidget),
@ -2879,8 +2893,11 @@ begin
if (OldCheckMenuItemToggleSize=0) then
OldCheckMenuItemToggleSize:=MENU_ITEM_CLASS(MenuItemWidget)^.toggle_size;
{$endif}
gtk_signal_connect_after(PGTKObject(MenuItemWidget), 'toggled',
TGTKSignalFunc(@GTKCheckMenuToggeledCB), Pointer(LCLMenuItem));
end;
// set attributes (enabled and rightjustify)
gtk_widget_set_sensitive(MenuItemWidget, LCLMenuItem.Enabled);
if LCLMenuItem.RightJustify then
@ -4259,6 +4276,9 @@ end;
{ =============================================================================
$Log$
Revision 1.188 2003/07/21 23:43:32 marc
* Fixed radiogroup menuitems
Revision 1.187 2003/07/02 10:02:51 mattias
fixed TPaintStruct

View File

@ -170,6 +170,7 @@ function gtkFocusOutNotifyCB (widget : PGtkWidget; event : PGdkEvent;
function GTKHScrollCB(Adjustment: PGTKAdjustment; data: GPointer): GBoolean; cdecl;
function GTKVScrollCB(Adjustment: PGTKAdjustment;
data: GPointer): GBoolean; cdecl;
function GTKCheckMenuToggeledCB(AMenuItem: PGTKCheckMenuItem; AData: gPointer): GBoolean; cdecl;
function GTKKeySnooper(Widget: PGtkWidget; Event: PGdkEventKey;
FuncData: gPointer): gInt; cdecl;
function gtkYearChanged(Widget: PGtkWidget; data: gPointer) : GBoolean; cdecl;
@ -429,6 +430,7 @@ function MENU_ITEM_CLASS(widget: PGtkWidget): PGtkMenuItemClass;
function CHECK_MENU_ITEM_CLASS(widget: PGtkWidget): PGtkCheckMenuItemClass;
function GetRadioMenuItemGroup(LCLMenuItem: TMenuItem): PGSList;
function GetRadioMenuItemGroup(MenuItem: PGtkRadioMenuItem): PGSList;
procedure LockRadioGroupOnChange(RadioGroup: PGSList; const ADelta: Integer);
procedure UpdateRadioGroupChecks(RadioGroup: PGSList);
procedure DrawMenuItemIcon(MenuItem: PGtkCheckMenuItem;
Area: PGdkRectangle); cdecl;

View File

@ -227,11 +227,24 @@ function TgtkObject.CheckMenuItem(hndMenu: HMENU; uIDEnableItem: Integer;
bChecked: Boolean): Boolean;
var
LCLMenuItem: TMenuItem;
IsRadio: Boolean;
Group: PGSList;
begin
if GTK_IS_CHECK_MENU_ITEM(Pointer(hndMenu)) then begin
LockOnChange(PgtkObject(hndMenu),1);
IsRadio := gtk_is_radio_menu_item(Pointer(hndMenu));
if IsRadio or gtk_is_check_menu_item(Pointer(hndMenu))
then begin
if IsRadio
then begin
Group := gtk_radio_menu_item_group(Pointer(hndMenu));
LockRadioGroupOnChange(Group, +1);
end
else LockOnChange(PgtkObject(hndMenu),1);
gtk_check_menu_item_set_active(PGtkCheckMenuItem(hndMenu),bChecked);
LockOnChange(PgtkObject(hndMenu),-1);
if IsRadio
then begin
LockRadioGroupOnChange(Group, -1);
end
else LockOnChange(PgtkObject(hndMenu),-1);
Result:=true;
end else begin
LCLMenuItem:=TMenuItem(GetLCLObject(Pointer(hndMenu)));
@ -6261,7 +6274,92 @@ end;
------------------------------------------------------------------------------}
function TgtkObject.RegroupMenuItem(hndMenu: HMENU;
GroupIndex: Integer): Boolean;
const
GROUPIDX_DATANAME = 'GroupIndex';
function GetGroup: PGSList;
var
Item: PGList;
Arg: TGTKArg;
begin
Result := nil;
Arg.theType := GTK_TYPE_OBJECT;
Arg.Name := 'parent';
gtk_widget_get(Pointer(hndMenu), @Arg);
if Arg.d.object_data = nil then Exit;
Item := gtk_container_children(PGTKContainer(Arg.d.object_data));
while Item <> nil do
begin
if (Item^.Data <> Pointer(hndMenu)) // exclude ourself
and gtk_is_radio_menu_item(Item^.Data)
and (GroupIndex = Integer(gtk_object_get_data(Item^.Data, GROUPIDX_DATANAME)))
then begin
Result := gtk_radio_menu_item_group(PGtkRadioMenuItem(Item^.Data));
Exit;
end;
Item := Item^.Next;
end;
end;
var
RadioGroup: PGSList;
CurrentGroupIndex: Integer;
begin
Result := False;
if not gtk_is_radio_menu_item(Pointer(hndMenu))
then begin
writeln('WARNING: TgtkObject.RegroupMenuItem: handle is not a GTK_RADIO_MENU_ITEM');
Exit;
end;
CurrentGroupIndex := Integer(gtk_object_get_data(Pointer(hndMenu), GROUPIDX_DATANAME));
// Update needed ?
if GroupIndex = CurrentGroupIndex
then begin
Result := True;
Exit;
end;
// Remove current group
gtk_radio_menu_item_set_group(PGtkRadioMenuItem(hndMenu), nil);
gtk_object_set_data(Pointer(hndMenu), GROUPIDX_DATANAME, nil);
// Check remove only
if GroupIndex = 0
then begin
Result := True;
Exit;
end;
// Try to find new group
RadioGroup := GetGroup;
// Set new group
gtk_object_set_data(Pointer(hndMenu), GROUPIDX_DATANAME, Pointer(GroupIndex));
if RadioGroup = nil
then begin
// We're the only member, get a group
RadioGroup := gtk_radio_menu_item_group(PGtkRadioMenuItem(hndMenu))
end
else begin
gtk_radio_menu_item_set_group(PGtkRadioMenuItem(hndMenu), RadioGroup);
end;
//radiogroup^.data
//radiogroup^.next
// Refetch newgroup list
RadioGroup := gtk_radio_menu_item_group(PGtkRadioMenuItem(hndMenu));
// Update checks
UpdateRadioGroupChecks(RadioGroup);
Result := True;
end;
// MWE: Reimplemented to get rid of unneeded group order constraint
// (which doesn't work if the menu isn't created in order)
(*
function GetGroup(ParentMenuItem: TMenuItem;
GrpIndex, LastRadioItem: integer): PGSList;
var
@ -6340,6 +6438,7 @@ begin
Result:=false;
end;
end;
*)
{------------------------------------------------------------------------------
Function: ReleaseCapture
@ -8608,6 +8707,9 @@ end;
{ =============================================================================
$Log$
Revision 1.264 2003/07/21 23:43:32 marc
* Fixed radiogroup menuitems
Revision 1.263 2003/07/20 06:39:03 mattias
added comments

View File

@ -141,7 +141,11 @@ type
procedure SubItemChanged(Sender: TObject; Source: TMenuItem;
Rebuild: Boolean);
procedure TurnSiblingsOff;
(*
* MWE: Disabled this feature, it makes not much sense
* See comments below
procedure VerifyGroupIndex(Position: Integer; Value: Byte);
*)
protected
property ActionLink: TMenuActionLink read FActionLink write FActionLink;
procedure CreateHandle; virtual;
@ -382,6 +386,9 @@ end.
{
$Log$
Revision 1.50 2003/07/21 23:43:32 marc
* Fixed radiogroup menuitems
Revision 1.49 2003/06/26 17:00:00 mattias
fixed result on searching proc in interface