{ $Id$ This file is part of the Free Pascal Integrated Development Environment Copyright (c) 1998 by Berczi Gabor Window menu entries See the file COPYING.FPC, included in this distribution, for details about the copyright. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. **********************************************************************} procedure TIDEApp.CloseAll; procedure SendClose(P: PView); {$ifndef FPC}far;{$endif} begin Message(P,evCommand,cmClose,nil); end; begin Desktop^.ForEach(@SendClose); end; procedure TIDEApp.ResizeApplication(x, y : longint); var OldR, R : TRect; Mode: TVideoMode; begin GetBounds(OldR); { adapt to new size } if (OldR.B.Y-OldR.A.Y<>y) or (OldR.B.X-OldR.A.X<>x) then begin Mode.color:=ScreenMode.Color; Mode.col:=x; Mode.row:=y; SetScreenVideoMode(Mode); Redraw; end; end; type PWindowListBox = ^TWindowListBox; TWindowListBox = object(TAdvancedListBox) constructor Init(var Bounds: TRect; AScrollBar: PScrollBar); function GetText(Item,MaxLen: Sw_Integer): String; virtual; end; PWindowListDialog = ^TWindowListDialog; TWindowListDialog = object(TCenterDialog) constructor Init; procedure HandleEvent(var Event: TEvent); virtual; destructor Done; virtual; private LB: PWindowListBox; C : PCollection; BtnShow,BtnHide: PNoUpdateButton; procedure UpdateList; procedure UpdateButtons; end; constructor TWindowListBox.Init(var Bounds: TRect; AScrollBar: PScrollBar); begin inherited Init(Bounds,1,AScrollBar); end; function TWindowListBox.GetText(Item,MaxLen: Sw_Integer): String; var P: PView; S: string; begin P:=List^.At(Item); case P^.HelpCtx of hcSourceWindow : S:=PSourceWindow(P)^.GetTitle(MaxLen); hcInfoWindow : S:=PProgramInfoWindow(P)^.GetTitle(MaxLen); hcHelpWindow : S:=PHelpWindow(P)^.GetTitle(MaxLen); hcCalcWindow : S:=PCalculator(P)^.GetTitle(MaxLen); hcBrowserWindow: S:=PBrowserWindow(P)^.GetTitle(MaxLen); hcCompilerMessagesWindow, hcMessagesWindow:S:=PMessagesWindow(P)^.GetTitle(MaxLen); hcGDBWindow, hcDisassemblyWindow, hcWatchesWindow, hcStackWindow, hcRegistersWindow, hcFPURegisters, hcClipboardWindow, hcASCIITableWindow, hcUserScreenWindow, hcBreakpointListWindow : S:=PWindow(P)^.GetTitle(MaxLen); else S:='???? - '+PWindow(P)^.GetTitle(MaxLen); end; if PWindow(P)^.Number<>0 then S:=S+'('+IntToStr(PWindow(P)^.Number)+')'; if P^.GetState(sfVisible) then S:=' '+S else begin S:='*'+S+' - '+msg_windowlist_hidden; end; GetText:=copy(S,1,MaxLen); end; constructor TWindowListDialog.Init; var R,R2: TRect; SB: PScrollBar; begin R.Assign(0,0,round(ScreenWidth*5/8),15); inherited Init(R, dialog_windowlist); HelpCtx:=hcWindowList; New(C, Init(20,10)); GetExtent(R); R.Grow(-2,-2); Inc(R.A.Y); R.B.X:=R.B.X-13; R2.Copy(R); R2.Move(1,0); R2.A.X:=R2.B.X-1; New(SB, Init(R2)); Insert(SB); New(LB, Init(R, SB)); LB^.Default:=true; LB^.NewList(C); UpdateList; if C^.Count>=2 then if PWindow(C^.At(1))^.GetState(sfVisible) then LB^.FocusItem(1); { focus the 2nd one } Insert(LB); R2.Copy(R); Dec(R2.A.Y); R2.B.Y:=R2.A.Y+1; Insert(New(PLabel, Init(R2, label_wndlist_windows, LB))); GetExtent(R); R.Grow(-2,-2); Inc(R.A.Y); R.A.X:=R.B.X-13+1; R.B.Y:=R.A.Y+2; Insert(New(PButton, Init(R, button_OK, cmOK, bfDefault))); R.Move(0,2); Insert(New(PButton, Init(R, button_Delete, cmDeleteItem, bfNormal))); R.Move(0,2); New(BtnShow, Init(R, button_Show, cmShowItem, bfNormal)); Insert(BtnShow); R.Move(0,2); New(BtnHide, Init(R, button_Hide, cmHideItem, bfNormal)); Insert(BtnHide); R.Move(0,2); Insert(New(PButton, Init(R, button_Cancel, cmCancel, bfNormal))); LB^.Select; PutCommand(@Self,evBroadcast,cmListFocusChanged,LB); end; procedure TWindowListDialog.UpdateList; var VisState: boolean; procedure AddIt(P: PView); {$ifndef FPC}far;{$endif} begin if (P<>pointer(Desktop^.Background)) and (P^.GetState(sfDisabled)=false) and ((P^.Options and ofSelectable)<>0) and (P^.GetState(sfVisible)=VisState) then C^.Insert(P); end; begin C^.DeleteAll; VisState:=true; Desktop^.ForEach(@AddIt); { add visible windows to list } VisState:=false; Desktop^.ForEach(@AddIt); { add hidden windows } LB^.SetRange(C^.Count); UpdateButtons; ReDraw; end; procedure TWindowListDialog.UpdateButtons; var W: PView; begin if LB^.Range>0 then begin W:=LB^.List^.At(LB^.Focused); if Assigned(BtnShow) then BtnShow^.SetState(sfDisabled,W^.GetState(sfVisible)); if Assigned(BtnHide) then BtnHide^.SetState(sfDisabled,not W^.GetState(sfVisible)); end else begin BtnShow^.SetState(sfDisabled,true); BtnHide^.SetState(sfDisabled,true); end; ReDraw; end; procedure TWindowListDialog.HandleEvent(var Event: TEvent); var W: PWindow; begin case Event.What of evKeyDown : case Event.KeyCode of kbDel : begin Message(@Self,evCommand,cmDeleteItem,nil); ClearEvent(Event); end; end; evBroadcast : case Event.Command of cmListFocusChanged : if Event.InfoPtr=LB then UpdateButtons; end; evCommand : case Event.Command of cmDeleteItem : if C^.Count>0 then begin Message(C^.At(LB^.Focused),evCommand,cmClose,nil); UpdateList; ClearEvent(Event); end; cmShowItem : if C^.Count>0 then begin PWindow(C^.At(LB^.Focused))^.Show; UpdateList; ClearEvent(Event); end; cmHideItem : if C^.Count>0 then begin PWindow(C^.At(LB^.Focused))^.Hide; UpdateList; ClearEvent(Event); end; cmOK : if C^.Count>0 then begin W:=PWindow(C^.At(LB^.Focused)); if W^.GetState(sfVisible)=false then W^.Show; W^.MakeFirst; end; end; end; inherited HandleEvent(Event); end; destructor TWindowListDialog.Done; begin if C<>nil then begin C^.DeleteAll; Dispose(C, Done); end; inherited Done; end; procedure TIDEApp.WindowList; var W: PWindowListDialog; begin New(W,Init); ExecView(W); Dispose(W,Done); if assigned(Desktop^.Current) then begin Desktop^.Lock; { force correct commands to be enabled } Desktop^.Current^.SetState(sfActive,false); Desktop^.Current^.SetState(sfActive,true); Desktop^.UnLock; end; end; { $Log$ Revision 1.4 2002-09-07 15:40:44 peter * old logs removed and tabs fixed Revision 1.3 2002/06/07 14:09:56 pierre * try to get resizing to work Revision 1.2 2002/05/30 15:03:24 pierre + ResizeApplication pethod for fvision }