None, None -> true
| Some e1, Some e2 when (e1 :> Gdome.node)#isSameNode (e2 :> Gdome.node) -> true
| _ -> false
-
+
(* true if n1 is n2 or one of n2's descendants *)
let rec descendant_of (n1 : Gdome.node) (n2 : Gdome.node) =
if n1#isSameNode n2 then true
let remove (el : Gdome.element) =
let rec remove_aux =
function
- hd::tl when (hd :> Gdome.node)#isSameNode (el :> Gdome.node) -> remove_aux tl
+ hd::tl when (hd :> Gdome.node)#isSameNode (el :> Gdome.node) ->
+ remove_aux tl
| hd::tl -> hd::(remove_aux tl)
| [] -> []
in
val mutable selection_changed = (fun _ -> ())
method set_selection elem =
+ self#freeze ;
begin
match root_selected with
None -> ()
| Some e -> self#unselect e
end;
- root_selected <- elem;
- match elem with
- None -> ()
- | Some e -> self#select e
+ root_selected <- elem ;
+ begin
+ match elem with
+ None -> ()
+ | Some e -> self#select e
+ end ;
+ self#thaw
method get_selection = root_selected
method connect =
- new single_selection_math_view_signals obj (function f -> selection_changed <- f)
+ new
+ single_selection_math_view_signals obj
+ (function f -> selection_changed <- f)
method action_toggle (elem : Gdome.element) =
match elem#get_namespaceURI, elem#get_localName with
- Some ns, Some ln when ns#to_string = "http://www.w3.org/1998/Math/MathML" &&
- ln#to_string = "maction" ->
+ Some ns, Some ln
+ when ns#to_string = "http://www.w3.org/1998/Math/MathML" &&
+ ln#to_string = "maction"
+ ->
begin
let selection_attr = Gdome.domString "selection" in
let selection =
in
self#freeze ;
(* the widget will cast the index back into a valid range *)
- elem#setAttribute ~name:selection_attr ~value:(Gdome.domString (string_of_int (selection + 1))) ;
+ elem#setAttribute ~name:selection_attr
+ ~value:(Gdome.domString (string_of_int (selection + 1))) ;
self#thaw ;
true
- end
+ end
| _ ->
begin
match elem#get_parentNode with
GdomeInit.DOMCastException _ -> false
end
| None -> assert false (* every element has a parent *)
- end
+ end
initializer
+ selection_changed <- self#set_selection ;
+
ignore
(self#connect#select_begin
(fun (elem : Gdome.element option) _ ->
- if not (same_element root_selected elem) then
- begin
- self#set_selection elem ;
- selection_changed elem
- end ;
- first_selected <- elem)) ;
+ if not (same_element root_selected elem) then selection_changed elem ;
+ first_selected <- elem)) ;
ignore
(self#connect#select_over
let new_selected =
match first_selected, elem with
Some first', Some last' ->
- (Some (new Gdome.element_of_node (common_ancestor (first' :> Gdome.node) (last' :> Gdome.node))))
+ (Some
+ (new Gdome.element_of_node
+ (common_ancestor (first' :> Gdome.node) (last' :> Gdome.node))))
| _ -> None
- in
+ in
if not (same_element root_selected new_selected) then
- begin
- self#set_selection new_selected ;
- selection_changed new_selected
- end)) ;
-
+ selection_changed new_selected)) ;
+
ignore
(self#connect#select_end
(fun (elem : Gdome.element option) _ -> first_selected <- None)) ;
(self#connect#select_abort
(fun () ->
first_selected <- None ;
- selection_changed None)) ;
+ selection_changed None)) ;
- ignore (self#connect#click (fun _ _ -> self#set_selection None))
+ ignore (self#connect#click (fun _ _ -> self#set_selection None))
end
;;
()
in
GtkBase.Container.set w ?border_width ?width ?height;
- let mathview = GObj.pack_return (new single_selection_math_view w) ~packing ~show in
- begin
- match font_size with
- | Some size -> mathview#set_font_size size
- | None -> ()
- end;
- begin
- match font_manager with
- | Some manager -> mathview#set_font_manager_type ~fm_type:manager
- | None -> ()
- end;
- mathview
+ let mathview =
+ GObj.pack_return (new single_selection_math_view w) ~packing ~show
+ in
+ begin
+ match font_size with
+ | Some size -> mathview#set_font_size size
+ | None -> ()
+ end;
+ begin
+ match font_manager with
+ | Some manager -> mathview#set_font_manager_type ~fm_type:manager
+ | None -> ()
+ end;
+ mathview
;;
-class multi_selection_math_view_signals obj (set_selection_changed : (Gdome.element option -> unit) -> unit) =
+class multi_selection_math_view_signals obj
+ (set_selection_changed : (Gdome.element option -> unit) -> unit)
+=
object
inherit GMathView.math_view_signals obj
method selection_changed = set_selection_changed
self#unselect elem
method remove_selections =
+ self#freeze ;
List.iter (fun e -> self#unselect e) selected ;
selected <- [] ;
- match self#get_selection with
- None -> ()
- | Some e -> self#select e
+ begin
+ match self#get_selection with
+ None -> ()
+ | Some e -> self#select e
+ end ;
+ self#thaw
method add_selection (elem : Gdome.element) =
selected <- elem::(remove_descendants_of elem selected) ;
method get_selections = selected
method set_selection elem =
+ self#freeze ;
begin
match root_selected with
None -> ()
| Some e -> self#unselect e ; List.iter (fun e -> self#select e) selected
end;
root_selected <- elem;
- match elem with
- None -> ()
- | Some e -> self#select e
+ begin
+ match elem with
+ None -> ()
+ | Some e -> self#select e
+ end ;
+ self#thaw
initializer
ignore
(self#connect#select_begin
(fun _ state ->
- if not (List.mem `CONTROL (Gdk.Convert.modifier state)) then self#remove_selections)) ;
+ if not (List.mem `CONTROL (Gdk.Convert.modifier state)) then
+ self#remove_selections)) ;
ignore
(self#connect#select_over
(fun _ state ->
Printf.printf "stable selections: %d\n" (List.length selected) ;
Printf.printf "select_over with state: " ;
- let c =
- function
- `SHIFT -> "shift "
- | `LOCK -> "lock "
- | `CONTROL -> "control "
- | `MOD1 -> "mod1 "
- | _ -> ""
- in
- List.iter (fun x -> print_string (c x)) (Gdk.Convert.modifier state) ;
- print_char '\n' ;
- flush stdout)) ;
+ let c =
+ function
+ `SHIFT -> "shift "
+ | `LOCK -> "lock "
+ | `CONTROL -> "control "
+ | `MOD1 -> "mod1 "
+ | _ -> ""
+ in
+ List.iter (fun x -> print_string (c x)) (Gdk.Convert.modifier state) ;
+ print_char '\n' ;
+ flush stdout)) ;
ignore
(self#connect#select_end
(fun _ state ->
Printf.printf "select_end\n" ; flush stdout ;
- if not (List.mem `CONTROL (Gdk.Convert.modifier state)) then self#remove_selections ;
- match root_selected with
- None -> ()
- | Some e -> self#set_selection None ; self#add_selection e)) ;
+ if not (List.mem `CONTROL (Gdk.Convert.modifier state)) then
+ self#remove_selections ;
+ match root_selected with
+ None -> ()
+ | Some e -> self#set_selection None ; self#add_selection e)) ;
ignore
(self#connect#click