TreeLabelEdit

Started by fred_tomke · 2009-04-24 05:42 UTC · 6 replies · SMF topic #728

Hello,

I want to prevent the user from renaming some labels in a tree. But some may be edited. As I remember I can solve this using CancelLabelEdit in the OnBeginLabelEdit event. But unfortunately, it stays editable. I use the tree in a palette. What am I doing wrong?


(defun c:layer_sc_ltm_tree_OnBeginLabelEdit (uKey /)
  (if (member (dcl_Tree_GetItemText layer_sc_ltm_tree uKey) '("Standard-Layertheme" "Standard-Layergroup"))
    (dcl_Tree_CancelLabelEdit layer_sc_ltm_tree)
  ); if
); c:layer_sc_ltm_tree_OnBeginLabelEdit


Fred
Hello,

I did some tests and I have the feeling that (dcl_Tree_CancelLabelEdit layer_sc_ltm_tree)  is without any effect?!

Fred
I've now made some changes to the code so that CancelLabelEdit works as expected from within the OnBeginLabelEdit event handler.
Thanks Owen!

Fred
Hello,

I don't know whether it belongs to the same case or not but shouldn't it be possible to change the item label within OnEndLabelEdit?


(defun c:layer_sc_ltm_tree_OnBeginLabelEdit (uKey)
  (setq ***ltm_label_name*** (cons uKey (dcl_Tree_GetItemText layer_sc_ltm_tree uKey)))
); c:layer_sc_ltm_tree_OnBeginLabelEdit

(defun c:layer_sc_ltm_tree_OnEndLabelEdit (strNewValue uKey / oObj oState)
  (cond
    ((not ***ltm_label_name***) nil)
    ((not (setq oObj (get_vlaObject_from_handle uKey))) nil)
    ((or (not strNewValue)
(= (setq strNewValue (vl-string-trim " " strNewValue)) "")
(= strNewValue (cdr ***ltm_label_name***))) nil)
    ((apply 'or (mapcar '(lambda (x) (vl-string-search x strNewValue))
'("<" ">" "/" "\\" "\"" ";" ":" "?" "*" "|" "~" "+" "." "," "=" "'" "´" "`"))) nil)
    ((< (setq intPic (car (dcl_Tree_GetItemImages layer_sc_ltm_tree uKey))) 2)
    (if (and (not (member (strcase strNewValue)
  (vl-remove (strcase (cdr ***ltm_label_name***))
    (mapcar 'strcase (mapcar 'vla-get-name (LTM_THEMES_LIST nil))))))
      (not (member (strcase strNewValue)
  (vl-remove (strcase (cdr ***ltm_label_name***))
    (mapcar 'strcase (mapcar 'vla-get-name (LTM_STATES_LIST)))))))
      (vla-put-name oObj strNewValue)
      (dcl_Tree_SetItemText layer_sc_ltm_tree uKey (cdr ***ltm_label_name***)) ;; <- this line does not work
    ))

    (T (dcl_Tree_SetItemText layer_sc_ltm_tree uKey (cdr ***ltm_label_name***))) ;; <- this line does not work
  ); cond
); c:layer_sc_ltm_tree_OnEndLabelEdit


Fred
The problem is that the edited label gets set *after* OnEndLabelEdit returns, so it overwrites whatever you set from within the event handler. Luckily, there is a way to cancel the edit, so I added code to cancel the edit if the OnEndLabelEdit event handler calls SetItemLabel. This change should allow calls to SetItemLabel to work from within the event handler.
Thanks, Owen!