123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190(**************************************************************************)(* *)(* This file is part of Frama-C. *)(* *)(* Copyright (C) 2007-2023 *)(* CEA (Commissariat à l'énergie atomique et aux énergies *)(* alternatives) *)(* *)(* you can redistribute it and/or modify it under the terms of the GNU *)(* Lesser General Public License as published by the Free Software *)(* Foundation, version 2.1. *)(* *)(* It 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. See the *)(* GNU Lesser General Public License for more details. *)(* *)(* See the GNU Lesser General Public License version 2.1 *)(* for more details (enclosed in the file licenses/LGPLv2.1). *)(* *)(**************************************************************************)letdkey=Gui_parameters.register_category"book_manager"moduleQ=Qstack.Make(structtypet=GSourceView.source_viewletequalxy=x==yend)typet={notebook:GPack.notebook;views:Q.t;}letmake?tab_pos?packing()=letnotebook=GPack.notebook~scrollable:true~show_tabs:true?tab_pos?packing()innotebook#set_enable_popuptrue;{notebook=notebook;views=Q.create();}letget_notebookt=t.notebookletset_current_viewtn=if(n>=0)&&(n<(Q.lengtht.views))thent.notebook#goto_pagenletprepend_source_tabwtitre=Gui_parameters.debug~dkey"prepend_source_tab";(* insert one extra tab in the source window w, with label *)letlabel=GMisc.label~text:titre()inletsw=GBin.scrolled_window~vpolicy:`AUTOMATIC~hpolicy:`AUTOMATIC~packing:(funarg->ignore(w.notebook#prepend_page~tab_label:label#coercearg))()inletwindow=(Source_viewer.make~packing:sw#add())in(* Remove default pango menu for textviews *)ignore(window#event#connect#button_press~callback:(funev->GdkEvent.Button.buttonev=3));Q.addwindoww.views;w.notebook#goto_page0;windowletget_nth_page(t:t)n=letnb=t.notebookinnb#get_nth_pagen(* Deprecated *)letcurrent_page(t:t)=letnb=t.notebookinnb#current_pageletlast_paget=Q.lengtht.views-1(* ABP and methods to manage this memory *)letget_current_view(t:t)=letnb=t.notebookinletcp=nb#current_pageinGui_parameters.debug~dkey"get_current_view: %d"cp;Q.nthcpt.viewsletget_current_index(t:t)=letcp=t.notebook#current_pageinGui_parameters.debug~dkey"get_current_index: %d"cp;cpletdelete_view(t:t)cp=letnb=t.notebookinGui_parameters.debug~dkey"delete_current_view - cur is page %d"cp;Q.remove(Q.nthcpt.views)t.views;nb#remove_pagecp;letlast=pred(Q.lengtht.views)inGui_parameters.debug~dkey"Going to page (delete_current_view) %d"last;nb#goto_pagelast(* delete within w the tab that contains window win *)letdelete_view_and_locwwin()=Gui_parameters.debug~dkey"delete_view_and_loc ";letidx=Q.idxwinw.viewsindelete_viewwidxletdelete_current_viewt=delete_viewtt.notebook#current_pageletdelete_all_views(t:t)=Q.iter(fun_->t.notebook#remove_page0)t.views;Q.cleart.viewsletappend_view(t:t)(v:GSourceView.source_view)=letnb=t.notebookinletnext=Q.lengtht.viewsinlettext=Printf.sprintf"Page %d"nextinletlabel=GMisc.label~text:text()inletsw=GBin.scrolled_window~vpolicy:`AUTOMATIC~hpolicy:`AUTOMATIC~packing:(funarg->ignore(nb#append_page~tab_label:label#coercearg))()insw#add(v:>GObj.widget);nb#goto_pagenext;Gui_parameters.debug~dkey"Going to page (append_view) %d"next;Q.add_at_endvt.views;Gui_parameters.debug~dkey"append_view - nb pages is %d"(Q.lengtht.views);Gui_parameters.debug~dkey"append_view - current nb page is %d"nb#current_pageletget_nth_viewt(n:int)=Q.nthnt.viewsletenable_popup(t:t)(b:bool)=letnb=t.notebookinnb#set_enable_popupbletset_scrollable(t:t)(b:bool)=letnb=t.notebookinnb#set_scrollableb(* get length of the current source_views list *)letlengtht=Q.lengtht.viewsletappend_source_tabwtitre=Gui_parameters.debug~dkey"append_source_tab";(* insert one extra tab in the source window w, with some title *)letcomposed_label=GPack.hbox()inlet_=GMisc.label~text:(titre)~packing:composed_label#add()inletcbutton=GButton.button~packing:composed_label#add()incbutton#set_use_stockfalse;cbutton#set_label"X";cbutton#misc#set_size_request~width:20~height:20();letsw=GBin.scrolled_window~vpolicy:`AUTOMATIC~hpolicy:`AUTOMATIC~packing:(funarg->ignore(w.notebook#append_page~tab_label:composed_label#coercearg))(*
~packing:(fun arg ->
ignore
(w.notebook#append_page ~tab_label:label#coerce arg)) *)()inletwindow=(Source_viewer.make~packing:sw#add())inignore(cbutton#connect#clicked~callback:(fun()->delete_view_and_locwwindow()));(* Remove default pango menu for textviews *)ignore(window#event#connect#button_press~callback:(funev->GdkEvent.Button.buttonev=3));Q.add_at_endwindoww.views;letlast=pred(Q.lengthw.views)in(* THIS CALLS THE SWITCH_PAGE CALLBACK IMMEDIATELY! *)w.notebook#goto_pagelast;window(*
Local Variables:
compile-command: "make -C ../../.."
End:
*)