123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275 |
- {
- 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);
- begin
- Message(P,evCommand,cmClose,nil);
- end;
- begin
- Desktop^.ForEach(TCallbackProcParam(@SendClose));
- end;
- procedure TIDEApp.ResizeApplication(x, y : longint);
- var
- OldR : 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);
- UpdateRecentFileList; {ensure file menu not go over screen}
- 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);
- hcHelpWindow : S:=PHelpWindow(P)^.GetTitle(MaxLen);
- hcCalcWindow : S:=PCalculator(P)^.GetTitle(MaxLen);
- hcBrowserWindow: S:=PBrowserWindow(P)^.GetTitle(MaxLen);
- hcCompilerMessagesWindow,
- hcMessagesWindow:S:=PFPWindow(P)^.GetTitle(MaxLen);
- hcGDBWindow,
- hcDisassemblyWindow,
- hcWatchesWindow,
- hcStackWindow,
- hcRegistersWindow,
- hcFPURegisters,
- hcVectorRegisters,
- 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-14;
- 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);
- 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(TCallbackProcParam(@AddIt)); { add visible windows to list }
- VisState:=false; Desktop^.ForEach(TCallbackProcParam(@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;
- KeePOwner : PGroup;
- 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
- W:=PWindow(C^.At(LB^.Focused));
- { we need to remove the window from the list
- because otherwise
- IDEApp.SourceWindowClosed
- is called after the object has been freed
- but the ListBox.Redraw will still try to
- read the title PM }
- KeepOwner:=W^.Owner;
- if assigned(KeepOwner) then
- KeepOwner^.Delete(W);
- UpdateList;
- { But reinsert it as Close might only
- trigger Hide in some cases }
- if assigned(KeepOwner) then
- KeepOwner^.Insert(W);
- Message(W,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;
|