@@ -280,8 +280,8 @@ export class MultilineText {
280280 init ( ) {
281281 this . override_view_methods ( ) ;
282282 this . setup_event_listeners ( ) ;
283- // Re-render all existing nodes to apply multiline formatting
284- this . rerender_existing_nodes ( ) ;
283+ this . initialized = true ;
284+ console . log ( 'Multiline text plugin initialized - ready for first render' ) ;
285285 }
286286
287287 /**
@@ -323,31 +323,19 @@ export class MultilineText {
323323 */
324324 restore_original_methods ( ) {
325325 const view = this . jm . view ;
326- if ( this . original_methods . edit_node_begin ) {
327- view . edit_node_begin = this . original_methods . edit_node_begin ;
328- }
329- if ( this . original_methods . edit_node_end ) {
330- view . edit_node_end = this . original_methods . edit_node_end ;
331- }
332- if ( this . original_methods . render_node ) {
333- view . render_node = this . original_methods . render_node ;
334- }
335- if ( this . original_methods . show ) {
336- view . show = this . original_methods . show ;
337- }
338- if ( this . original_methods . _custom_node_render ) {
339- view . _custom_node_render = this . original_methods . _custom_node_render ;
340- }
341- if ( this . original_methods . _default_node_render ) {
342- view . _default_node_render = this . original_methods . _default_node_render ;
343- }
326+ const methods = [ 'edit_node_begin' , 'edit_node_end' , 'render_node' , 'show' , '_custom_node_render' , '_default_node_render' ] ;
327+
328+ methods . forEach ( method => {
329+ if ( this . original_methods [ method ] ) {
330+ view [ method ] = this . original_methods [ method ] ;
331+ }
332+ } ) ;
344333 }
345334
346335 /**
347336 * Set up event listeners for the plugin.
348337 */
349338 setup_event_listeners ( ) {
350- // Listen for jsMind events if needed
351339 this . jm . add_event_listener ( ( type , data ) => {
352340 this . jm_event_handle ( type , data ) ;
353341 } ) ;
@@ -397,8 +385,8 @@ export class MultilineText {
397385 return ;
398386 }
399387
400- // Store original dimensions for layout recalculation
401- const originalHeight = element . clientHeight ;
388+ const hasMultilineText = node . topic . includes ( '\n' ) ;
389+ const originalHeight = hasMultilineText ? element . clientHeight : 0 ;
402390
403391 // Check if we have custom node render function
404392 const hasCustomRender =
@@ -408,7 +396,6 @@ export class MultilineText {
408396 let customRendered = false ;
409397
410398 if ( hasCustomRender ) {
411- // Try custom render first
412399 try {
413400 customRendered = this . jm . view . opts . custom_node_render ( this . jm , element , node ) ;
414401 } catch ( error ) {
@@ -417,23 +404,36 @@ export class MultilineText {
417404 }
418405 }
419406
420- // If custom render didn't handle it, use our multiline logic
407+ // If custom render didn't handle it, use appropriate rendering strategy
421408 if ( ! customRendered ) {
422- // Use the new static rendering function with plugin configuration
423- renderTextToElement ( element , node . topic , {
424- clearElement : true ,
425- applyStyles : true ,
426- supportHtml : this . jm . view . opts . support_html || false ,
427- } ) ;
409+ if ( hasMultilineText ) {
410+ renderTextToElement ( element , node . topic , {
411+ clearElement : true ,
412+ applyStyles : true ,
413+ supportHtml : this . jm . view . opts . support_html || false ,
414+ } ) ;
415+ } else {
416+ if ( this . original_methods . render_node ) {
417+ this . original_methods . render_node ( element , node ) ;
418+ return ;
419+ } else {
420+ renderTextToElement ( element , node . topic , {
421+ clearElement : true ,
422+ applyStyles : false ,
423+ supportHtml : this . jm . view . opts . support_html || false ,
424+ } ) ;
425+ }
426+ }
428427 }
429428
430- // Check if height changed and trigger layout update if needed
431- const newHeight = element . clientHeight ;
432- if ( originalHeight !== newHeight && originalHeight > 0 ) {
433- // Use setTimeout to ensure DOM has updated before recalculating
434- setTimeout ( ( ) => {
435- this . recalculate_layout ( node ) ;
436- } , 0 ) ;
429+ // Recalculate layout only if multiline text height changed
430+ if ( hasMultilineText && originalHeight > 0 ) {
431+ const newHeight = element . clientHeight ;
432+ if ( originalHeight !== newHeight ) {
433+ setTimeout ( ( ) => {
434+ this . recalculate_layout ( node ) ;
435+ } , 0 ) ;
436+ }
437437 }
438438 }
439439
@@ -544,15 +544,9 @@ export class MultilineText {
544544 }
545545
546546 this . editing_node = node ;
547-
548547 this . jm . view . editing_node = node ;
549548
550- const view_data = node . _data . view ;
551- const element = view_data . element ;
552- const topic = node . topic ;
553-
554- // Create multiline editor
555- this . create_multiline_editor ( element , topic ) ;
549+ this . create_multiline_editor ( node . _data . view . element , node . topic ) ;
556550 }
557551
558552 /**
@@ -702,6 +696,16 @@ export class MultilineText {
702696 selection . addRange ( range ) ;
703697 }
704698
699+ /**
700+ * Reset editing state and return focus to panel.
701+ */
702+ _reset_editing_state ( ) {
703+ this . editing_node = null ;
704+ this . jm . view . editing_node = null ;
705+ this . multiline_editor = null ;
706+ this . jm . view . e_panel . focus ( ) ;
707+ }
708+
705709 /**
706710 * End editing and save changes.
707711 */
@@ -711,36 +715,21 @@ export class MultilineText {
711715 }
712716
713717 const node = this . editing_node ;
714- const view_data = node . _data . view ;
715- const element = view_data . element ;
718+ const element = node . _data . view . element ;
716719 const topic = this . multiline_editor . textContent || '' ;
717720
718- // Clean up editor
719721 this . cleanup_editor ( element ) ;
720722
721- // Process and validate text
722723 const processed_topic = this . process_multiline_text ( topic ) ;
723724
724- // Update node if text changed
725725 if ( jsMind . util . text . is_empty ( processed_topic ) || node . topic === processed_topic ) {
726- // No change or empty text, just re-render
727726 this . _render_multiline_node ( element , node ) ;
728727 } else {
729- // Text changed, update node
730728 this . jm . update_node ( node . id , processed_topic ) ;
731729 }
732730
733- // Trigger layout recalculation
734731 this . recalculate_layout ( node ) ;
735-
736- // Reset editing state
737- this . editing_node = null ;
738-
739- this . jm . view . editing_node = null ;
740- this . multiline_editor = null ;
741-
742- // Return focus to panel
743- this . jm . view . e_panel . focus ( ) ;
732+ this . _reset_editing_state ( ) ;
744733 }
745734
746735 /**
@@ -752,23 +741,11 @@ export class MultilineText {
752741 }
753742
754743 const node = this . editing_node ;
755- const view_data = node . _data . view ;
756- const element = view_data . element ;
744+ const element = node . _data . view . element ;
757745
758- // Clean up editor
759746 this . cleanup_editor ( element ) ;
760-
761- // Restore original content
762747 this . _render_multiline_node ( element , node ) ;
763-
764- // Reset editing state
765- this . editing_node = null ;
766-
767- this . jm . view . editing_node = null ;
768- this . multiline_editor = null ;
769-
770- // Return focus to panel
771- this . jm . view . e_panel . focus ( ) ;
748+ this . _reset_editing_state ( ) ;
772749 }
773750
774751 /**
@@ -803,24 +780,35 @@ export class MultilineText {
803780 }
804781
805782 /**
806- * Re-render all existing nodes to apply multiline formatting .
783+ * Re-render only nodes that contain multiline text for better performance .
807784 */
808- rerender_existing_nodes ( ) {
785+ rerender_multiline_nodes_only ( ) {
809786 if ( ! this . jm . mind || ! this . jm . mind . nodes ) {
810787 return ;
811788 }
812789
813- // Re-render all nodes that have multiline text
790+ let rerendered_count = 0 ;
814791 const nodes = this . jm . mind . nodes ;
792+
815793 for ( const node_id in nodes ) {
816794 const node = nodes [ node_id ] ;
817795 if ( node . topic && node . topic . includes ( '\n' ) ) {
818796 const view_data = node . _data . view ;
819797 if ( view_data && view_data . element ) {
820798 this . _render_multiline_node ( view_data . element , node ) ;
799+ rerendered_count ++ ;
821800 }
822801 }
823802 }
803+
804+ console . log ( `Multiline text plugin: Re-rendered ${ rerendered_count } multiline nodes` ) ;
805+ }
806+
807+ /**
808+ * @deprecated Use rerender_multiline_nodes_only() for better performance
809+ */
810+ rerender_existing_nodes ( ) {
811+ this . rerender_multiline_nodes_only ( ) ;
824812 }
825813
826814 /**
@@ -857,10 +845,10 @@ export class MultilineText {
857845 * @param {object } [data] - Event data
858846 */
859847 jm_event_handle ( type , data ) {
860- // Handle events if needed
861848 if ( type === jsMind . event_type . resize ) {
862- // Handle resize events
849+ // Handle resize events if needed
863850 }
851+ void data ; // Suppress unused parameter warning
864852 }
865853}
866854
0 commit comments