(FILECREATED "30-Nov-87 15:09:45" {QV}<NOTECARDS>1.3KNEXT>LIBRARY>NCHACKS.;1 24335  

      changes to:  (FNS NCHACKS.MakeLinkIconsInvisibleInTextCard NCHACKS.MakeLinkIconForLinkInvisible)

      previous date: "18-Aug-87 15:31:00" {QV}<NOTECARDS>1.3K>LIBRARY>NCHACKS.;6)


(* Copyright (c) 1985, 1986, 1987 by Xerox Corporation. All rights reserved.)

(PRETTYCOMPRINT NCHACKSCOMS)

(RPAQQ NCHACKSCOMS ((* * global text search and global text replace.)
		      (FNS NCHACKS.GlobalTextReplace NCHACKS.TextSearch 
			   NCHACKS.GlobalTextReplaceInCard NCHACKS.TextSearchInCard)
		      (* * remove deleted icons from text cards.)
		      (FNS NCHACKS.RemoveDeletedIconsFromTextCards 
			   NCHACKS.RemoveDeletedIconsFromTextCard)
		      (* * sort link icons in text cards.)
		      (FNS NCHACKS.ReorderLinkIconsInTextCards NCHACKS.ReorderLinkIconsInTextCard)
		      (* * search for card parts with dates in a specified range.)
		      (FNS NCHACKS.DateSearch NCHACKS.DateSearchInCard)
		      (* * search for cards which have been modified/created within given time 
			 periods.)
		      (FNS NCHACKS.CardsModifiedBetweenDates)
		      (* * make a chain linking cards using a given link type.)
		      (FNS NCHACKS.MakeChain)
		      (* * Make link icons invisible in text cards.)
		      (FNS NCHACKS.MakeLinkIconsInvisible NCHACKS.MakeLinkIconsInvisibleInTextCard 
			   NCHACKS.MakeLinkIconForLinkInvisible NCHACKS.MakeTEditCharInvisible)))
(* * global text search and global text replace.)

(DEFINEQ

(NCHACKS.GlobalTextReplace
  (LAMBDA (String1 String2 WildCards? CardsOrNoteFile)       (* rht: "28-Apr-87 11:12")

          (* * CardsOrNoteFile should be either a single card, a list of cards, or an open notefile, in which case all the 
	  cards in it are checked. Only cards of types inheriting from Text are considered. This goes through the Cards list 
	  replacing every occurrence of text string String1 by String2. WildCards? non-nil means wild card characters may 
	  appear in String1. # matches any single character, * matches any sequence of characters, and ' can be used to quote
	  one of the wildcard characters.)



          (* * rht 4/28/87: Took out second arg to FUNCTION.)


    (if (NCP.OpenNoteFileP CardsOrNoteFile)
	then (NCP.MapCards CardsOrNoteFile (FUNCTION (LAMBDA (Card)
				 (NCHACKS.GlobalTextReplaceInCard String1 String2 WildCards? Card)))
			     )
      else (for Card in (MKLIST CardsOrNoteFile) when (NCP.ValidCardP Card)
		do (NCHACKS.GlobalTextReplaceInCard String1 String2 WildCards? Card)))))

(NCHACKS.TextSearch
  (LAMBDA (String WildCards? CardsOrNoteFile ReturnLocsFlg)
                                                             (* rht: "28-Apr-87 11:16")

          (* * CardsOrNoteFile should be either a single card, a list of cards, or an open notefile, in which case all the 
	  cards in it are checked. Only cards of types inheriting from Text are considered. This goes through the Cards list 
	  looking for occurrences of text string String. WildCards? non-nil means wild card characters may appear in String.
	  # matches any single character, * matches any sequence of characters, and ' can be used to quote one of the 
	  wildcard characters. If ReturnLocsFlg is nil, then just return list of cards containing at least one occurrence of 
	  String. If ReturnLocsFlg is non-nil, then return a list of lists. Each list has first element a card id followed by
	  the locations of occurrences of String. These are single integers if WildCards? is nil. If WildCards? is non-nil, 
	  then these are lists of start and end locations of the matching string.)



          (* * rht 4/28/87: Changed APPLY of NCONC to call to MAPCONC.)


    (if (NCP.OpenNoteFileP CardsOrNoteFile)
	then (MAPCONC (NCP.MapCards CardsOrNoteFile (FUNCTION (LAMBDA (Card)
					    (NCHACKS.TextSearchInCard String WildCards? Card 
									ReturnLocsFlg)))
					(FUNCTION TRUE))
			  (FUNCTION (LAMBDA (X)
			      X)))
      else (for Card in (MKLIST CardsOrNoteFile) when (NCP.ValidCardP Card)
		join (NCHACKS.TextSearchInCard String WildCards? Card ReturnLocsFlg)))))

(NCHACKS.GlobalTextReplaceInCard
  (LAMBDA (String1 String2 WildCards? Card)                  (* rht: "17-Jul-86 18:01")

          (* * Replaces every occurrence of text string String1 by String2 in contents of Card. WildCards? non-nil means wild
	  card characters may appear in String1. # matches any single character, * matches any sequence of of characters, and
	  QUOTE can be used to quote one of the wildcard characters.)


    (if (NCP.TextBasedP Card)
	then (LET ((WasActiveFlg (NCP.CardCachedP Card))
		     (Length (NCHARS String1))
		     (Loc 0)
		     TextStream)
		    (if (NOT WasActiveFlg)
			then (NCP.CacheCards Card))
		    (SETQ TextStream (NCP.CardSubstance Card))
		    (while (SETQ Loc (TEDIT.FIND TextStream String1 (ADD1 Loc)
						       NIL WildCards?))
		       do (if WildCards?
				then (SETQ Length (ADD1 (DIFFERENCE (CADR Loc)
									    (CAR Loc))))
				       (SETQ Loc (CAR Loc)))
			    (TEDIT.DELETE TextStream Loc Length)
			    (TEDIT.INSERT TextStream String2 Loc))
		    (if (NOT WasActiveFlg)
			then (NCP.UncacheCards Card))))))

(NCHACKS.TextSearchInCard
  (LAMBDA (String WildCards? Card ReturnLocsFlg)             (* rht: " 5-May-87 17:22")

          (* * This goes through Card looking for occurrences of text string String. WildCards? non-nil means wild card 
	  characters may appear in String. %# matches any single character, * matches any sequence of characters, and ' can 
	  be used to quote one of the wildcard characters. If no occurrence found, then return NIL. Otherwise, if 
	  ReturnLocsFlg is nil, then return a list of this card. Else return a list having as first element a card id 
	  followed by the locations of occurrences of String. These are single integers if WildCards? is nil.
	  If WildCards? is non-nil, then these are lists of start and end locations of the matching string.)



          (* * rht 5/5/87: Now passes non-nil %#START arg to TEDIT.FIND when ReturnLocsFlg is nil.)


    (if (NCP.TextBasedP Card)
	then (LET ((WasActiveFlg (NCP.CardCachedP Card))
		     (Length (NCHARS String))
		     (Loc 0)
		     Hits TextStream)
		    (if (NOT WasActiveFlg)
			then (NCP.CacheCards Card))
		    (SETQ TextStream (NCP.CardSubstance Card))
		    (PROG1 (if ReturnLocsFlg
				 then (if (SETQ Hits (while (SETQ Loc (TEDIT.FIND
									TextStream String
									(ADD1 Loc)
									NIL WildCards?))
							      collect (PROG1
									  Loc
									  (if WildCards?
									      then (SETQ Loc
										       (CAR Loc)))))
						)
					    then (LIST (CONS Card Hits)))
			       else (if (TEDIT.FIND TextStream String 1 NIL WildCards?)
					  then (LIST Card)))
			     (if (NOT WasActiveFlg)
				 then (NCP.UncacheCards Card)))))))
)
(* * remove deleted icons from text cards.)

(DEFINEQ

(NCHACKS.RemoveDeletedIconsFromTextCards
  (LAMBDA (CardsOrNoteFile)                                  (* rht: "17-Jul-86 18:13")

          (* * For cards in Cards of substance type TEXT, remove all deleted link icons from their substance.)


    (if (NCP.OpenNoteFileP CardsOrNoteFile)
	then (NCP.MapCards CardsOrNoteFile (FUNCTION (LAMBDA (Card)
				 (NCHACKS.RemoveDeletedIconsFromTextCard Card))))
      else (for Card in (MKLIST CardsOrNoteFile) when (NCP.ValidCardP Card)
		do (NCHACKS.RemoveDeletedIconsFromTextCard Card)))))

(NCHACKS.RemoveDeletedIconsFromTextCard
  (LAMBDA (Card)                                             (* rht: "18-Jul-86 14:34")

          (* * Remove all deleted link icons from Card's substance.)


    (if (NCP.TextBasedP Card)
	then (LET ((WasActiveFlg (NCP.CardCachedP Card))
		     TextStream)
		    (if (NOT WasActiveFlg)
			then (NCP.CacheCards Card))
		    (SETQ TextStream (NCP.CardSubstance Card))
                                                             (* Need to reverse list so that we delete the last 
							     icon first.)
		    (for IconPair in (REVERSE (TEDIT.LIST.OF.OBJECTS (TEXTOBJ TextStream)
									     (FUNCTION 
									  NC.DeletedLinkImageObjP)))
		       do (TEDIT.DELETE TextStream (CADR IconPair)
					    1))
		    (if (NOT WasActiveFlg)
			then (NCP.UncacheCards Card))))))
)
(* * sort link icons in text cards.)

(DEFINEQ

(NCHACKS.ReorderLinkIconsInTextCards
  (LAMBDA (CardsOrNoteFile OrderingFn QuietFlg)              (* rht: "28-Apr-87 11:13")

          (* * Resort the link icons occuring in Cards according to OrderingFn. If OrderingFn is the litatom ALPHABETIZE, 
	  then use NC.IDAlphOrder. If OrderingFn is NIL, then use the OrderingFn prop of the card or NC.IDAlphOrder if none.
	  Print message to prompt window unless QuietFlg is non-nil.)



          (* * rht 4/28/87: Took out second arg to FUNCTION.)


    (if (EQ OrderingFn (QUOTE ALPHABETIZE))
	then (SETQ OrderingFn (FUNCTION NC.IDAlphOrder)))
    (if (NCP.OpenNoteFileP CardsOrNoteFile)
	then (NCP.MapCards CardsOrNoteFile (FUNCTION (LAMBDA (Card)
				 (NCHACKS.ReorderLinkIconsInTextCard Card OrderingFn QuietFlg))))
      else (for Card in (MKLIST CardsOrNoteFile) when (NCP.ValidCardP Card)
		do (NCHACKS.ReorderLinkIconsInTextCard Card OrderingFn QuietFlg)))
    (OR QuietFlg (NCP.PrintMsg NIL T "Done."))))

(NCHACKS.ReorderLinkIconsInTextCard
  (LAMBDA (Card OrderingFn QuietFlg)                         (* rht: "18-Jul-86 15:34")

          (* * Resort the link icons occuring in Card according to OrderingFn. If the latter is NIL, then use the OrderingFn 
	  prop of the card, or NC.IDAlphOrder if none such.)


    (if (NCP.TextBasedP Card)
	then (OR QuietFlg (NCP.PrintMsg NIL T "Sorting link icons in " Card " ..."))
	       (LET ((WasActiveFlg (NCP.CardCachedP Card))
		     TextStream OrderingFnToUse TextObj LinkIconsAndLocs SortedCardsAndLocs)
		    (if (NOT WasActiveFlg)
			then (NCP.CacheCards Card))
		    (if (SETQ OrderingFnToUse (OR OrderingFn (NCP.CardProp Card (QUOTE
										     OrderingFn))
							(FUNCTION NC.IDAlphOrder)))
			then (SETQ TextStream (NCP.CardSubstance Card))
			       (SETQ TextObj (TEXTOBJ TextStream))
			       (SETQ LinkIconsAndLocs (TEDIT.LIST.OF.OBJECTS
				   TextObj
				   (FUNCTION NC.LinkIconImageObjP)))
			       (SETQ SortedCardsAndLocs
				 (SORT (for LinkIconAndLoc in LinkIconsAndLocs as i
					    from 0 eachtime (BLOCK)
					    collect (LIST (NC.FetchLinkFromLinkIcon
								(CAR LinkIconAndLoc))
							      (CADR LinkIconAndLoc)))
					 (FUNCTION (LAMBDA (CardAndLoc1 CardAndLoc2)
					     (APPLY* OrderingFnToUse (CAR CardAndLoc1)
						       (CAR CardAndLoc2))))))
			       (for RestOfSortedCardsAndLocs on SortedCardsAndLocs as 
										   LinkIconAndLoc
				  in LinkIconsAndLocs eachtime (BLOCK)
				  bind Loc FromLoc ToLoc Sel1 Sel2
				  do 

          (* * Location to move FROM is taken from next pair in sorted list.)


				       (TEDIT.SETSEL TextObj (SETQ FromLoc (CADAR 
									 RestOfSortedCardsAndLocs))
						       1
						       (QUOTE LEFT))
				       (SETQ Sel1 (TEDIT.GETSEL TextStream)) 

          (* * Location to move TO is just next pair on unsorted list, except that there may be intervening guys that will 
	  later move out of the way.)


				       (TEDIT.SETSEL TextObj (SETQ ToLoc
							 (PLUS (SETQ Loc (CADR LinkIconAndLoc))
								 (for CardAndLoc
								    in (CDR 
									 RestOfSortedCardsAndLocs)
								    eachtime (BLOCK)
								    when (LESSP (CADR 
										       CardAndLoc)
										    Loc)
								    count CardAndLoc)))
						       0
						       (QUOTE LEFT))
				       (SETQ Sel2 (TEDIT.GETSEL TextStream))
				       (TEDIT.MOVE Sel1 Sel2) 

          (* * Now increment any locs of pairs whose location has changed by virtue of this move.)


				       (for CardAndLoc in (CDR RestOfSortedCardsAndLocs)
					  bind Loc eachtime (BLOCK)
					  when (AND (LESSP (SETQ Loc (CADR CardAndLoc))
								 FromLoc)
							(LEQ ToLoc Loc))
					  do (RPLACA (CDR CardAndLoc)
							 (ADD1 Loc)))))
		    (if (NOT WasActiveFlg)
			then (NCP.UncacheCards Card))))))
)
(* * search for card parts with dates in a specified range.)

(DEFINEQ

(NCHACKS.DateSearch
  (LAMBDA (DateString1 DateString2 CardsOrNoteFile)          (* rht: "28-Apr-87 11:15")

          (* * There should be an open notefile. This goes through the Cards list looking for occurrences of card parts 
	  modified between the dates DateString1 and DateString2. If DateString1 is NIL, then defaults to a very early date.
	  If DateString2 is NIL, then defaults to current date.)



          (* * rht 4/28/87: Changed APPLY of NCONC to call to MAPCONC.)


    (LET ((IDate1 (OR (IDATE (OR DateString1 " 1-Jan-70 00:00:00"))
			(IDATE " 1-Jan-70 00:00:00")))
	  (IDate2 (OR (IDATE (OR DateString2 (DATE)))
			(IDATE (DATE)))))
         (if (NCP.OpenNoteFileP CardsOrNoteFile)
	     then (MAPCONC (NCP.MapCards CardsOrNoteFile (FUNCTION (LAMBDA (Card)
						 (NCHACKS.DateSearchInCard IDate1 IDate2 Card)))
					     (FUNCTION TRUE))
			       (FUNCTION (LAMBDA (X)
				   X)))
	   else (for Card in (MKLIST CardsOrNoteFile) when (NCP.ValidCardP Card)
		     join (NCHACKS.DateSearchInCard IDate1 IDate2 Card))))))

(NCHACKS.DateSearchInCard
  (LAMBDA (IDate1 IDate2 Card)                               (* rht: "17-Jul-86 17:56")

          (* * This goes through Card's card parts looking for those modified between the numeric dates IDate1 and IDate2.)


    (LET ((WasActiveFlg (NCP.CardCachedP Card))
	  Hits IDate Date Dates)
         (if (NOT WasActiveFlg)
	     then (NCP.CacheCards Card))
         (SETQ Dates (NCP.GetCardDates Card))
         (SETQ Hits (LDIFFERENCE (LIST (if (AND (LESSP IDate1
								   (SETQ IDate
								     (IDATE (SETQ Date
										(fetch
										  (NOTECARDDATES
										    SUBSTANCEDATE)
										   of Dates)))))
							  (LESSP IDate IDate2))
						 then (LIST (QUOTE SUBSTANCEDATE)
								Date))
					     (if (AND (LESSP IDate1
								   (SETQ IDate
								     (IDATE (fetch (NOTECARDDATES
											 LINKSDATE)
										 of Dates))))
							  (LESSP IDate IDate2))
						 then (LIST (QUOTE LINKSDATE)
								Date))
					     (if (AND (LESSP IDate1
								   (SETQ IDate
								     (IDATE (fetch (NOTECARDDATES
											 TITLEDATE)
										 of Dates))))
							  (LESSP IDate IDate2))
						 then (LIST (QUOTE TITLEDATE)
								Date))
					     (if (AND (LESSP IDate1
								   (SETQ IDate
								     (IDATE (fetch (NOTECARDDATES
											 PROPLISTDATE)
										 of Dates))))
							  (LESSP IDate IDate2))
						 then (LIST (QUOTE PROPLISTDATE)
								Date)))
				     (LIST NIL)))
         (PROG1 (if Hits
		      then (LIST (CONS Card Hits))
		    else NIL)
		  (if (NOT WasActiveFlg)
		      then (NCP.UncacheCards Card))))))
)
(* * search for cards which have been modified/created within given time periods.)

(DEFINEQ

(NCHACKS.CardsModifiedBetweenDates
  (LAMBDA (CardsOrNoteFile CardTypes ModifiedRange LastModifiedRange CreatedRange)
                                                             (* pmi: "18-Aug-87 11:14")

          (* * pmi 7/14/87: First created to answer the question: Which cards in CardsOrNoteFile of card type 
	  (one of CardTypes) were modified or last modified or created between EarlierDate and LaterDate? If 
	  ModifiedOrLastModifiedOrCreated is NIL, (QUOTE Modified) is used. If EarlierDate is NIL, it succeeds on any date 
	  before LaterDate. If LaterDate is NIL, it succeeds on any date after EarlierDate. If CardTypes is NIL, all card 
	  types are searched. CardsOrNoteFile should be a card, a list of cards, or an open notefile.)



          (* * 8/18/87: Modified to take three date ranges, one for modified, one for last modified, and one for created.
	  Each range should be a list of start and end dates of the form DD-Mon-YY, where Mon contains the first three 
	  letters of the month. Returns the intersection of cards which were modified/created between these three date 
	  ranges.)


    (LET (EarlierModDate LaterModDate EarlierLastModDate LaterLastModDate EarlierCreateDate 
			 LaterCreateDate)
         (if (LISTP ModifiedRange)
	     then (SETQ EarlierModDate (OR (IDATE (CONCAT (CAR ModifiedRange)
								    " 00:00:00"))
						 0))
		    (SETQ LaterModDate (OR (IDATE (CONCAT (CADR ModifiedRange)
								  " 23:59:59"))
					       MAX.INTEGER)))
         (if (LISTP LastModifiedRange)
	     then (SETQ EarlierLastModDate (OR (IDATE (CONCAT (CAR LastModifiedRange)
									" 00:00:00"))
						     0))
		    (SETQ LaterLastModDate (OR (IDATE (CONCAT (CADR LastModifiedRange)
								      " 23:59:59"))
						   MAX.INTEGER)))
         (if (LISTP CreatedRange)
	     then (SETQ EarlierCreateDate (OR (IDATE (CONCAT (CAR CreatedRange)
								       " 00:00:00"))
						    0))
		    (SETQ LaterCreateDate (OR (IDATE (CONCAT (CADR CreatedRange)
								     " 23:59:59"))
						  MAX.INTEGER)))
         (for Card in (NCP.CardsOfTypes CardsOrNoteFile CardTypes) bind CardUpdates CardDate
	    when (AND (SETQ CardUpdates (MAPCAR (NCP.CardProp Card (QUOTE Updates))
							(QUOTE CADR)))
			  (if (LISTP ModifiedRange)
			      then (for Date in CardUpdates when (AND (SETQ CardDate
										  (IDATE Date))
										(IGEQ CardDate 
										   EarlierModDate)
										(ILEQ CardDate 
										     LaterModDate))
					do (RETURN T) finally (RETURN NIL))
			    else T)
			  (if (LISTP LastModifiedRange)
			      then (SETQ CardDate (IDATE (CAR CardUpdates)))
				     (if (AND (IGEQ CardDate EarlierLastModDate)
						  (ILEQ CardDate LaterLastModDate))
					 then T
				       else NIL)
			    else T)
			  (if (LISTP CreatedRange)
			      then (SETQ CardDate (IDATE (CAR (LAST CardUpdates))))
				     (if (AND (IGEQ CardDate EarlierCreateDate)
						  (ILEQ CardDate LaterCreateDate))
					 then T
				       else NIL)
			    else T))
	    collect Card))))
)
(* * make a chain linking cards using a given link type.)

(DEFINEQ

(NCHACKS.MakeChain
  (LAMBDA (LinkType Cards Position AddCRFlg)                 (* rht: "17-Jul-86 18:05")

          (* * Create links between successive cards in Cards each of type LinkType positioned at Position.)


    (for RestOfCards on Cards bind (LastCard ←(CAR (LAST Cards)))
					 Card
       until (EQ (SETQ Card (CAR RestOfCards))
		     LastCard)
       when (AND (NCP.ValidCardP Card)
		     (NCP.TextBasedP Card))
       do (if (AND AddCRFlg (EQ Position (QUOTE END)))
		then (NCP.CardAddText Card (CHARACTER 13)
					  Position))
	    (NCP.CreateLink (LIST Card Position)
			      (CADR RestOfCards)
			      LinkType)
	    (if (AND AddCRFlg (EQ Position (QUOTE START)))
		then (NCP.CardAddText Card (CHARACTER 13))))))
)
(* * Make link icons invisible in text cards.)

(DEFINEQ

(NCHACKS.MakeLinkIconsInvisible
  (LAMBDA (CardsOrLinksOrNoteFile Invisibility)              (* rht: "28-Apr-87 11:16")

          (* * CardsOrLinksOrNoteFile should be one of: a card, a link, a list of cards and links, or a notefile.
	  Make any link icons for given links or contained in given cards or notefile that are in text cards invisible.
	  Invisibility should be one of the atoms ON or OFF.)



          (* * rht 4/28/87: Took out second arg to FUNCTION.)


    (if (NCP.OpenNoteFileP CardsOrLinksOrNoteFile)
	then (NCP.MapCards CardsOrNoteFile (FUNCTION (LAMBDA (Card)
				 (NCHACKS.MakeLinkIconsInvisibleInTextCard Card Invisibility))))
      else (for CardOrLink in (MKLIST CardsOrLinksOrNoteFile) do (COND
									     ((NCP.ValidCardP
										 CardOrLink)
									       (
							 NCHACKS.MakeLinkIconsInvisibleInTextCard
										 CardOrLink 
										 Invisibility))
									     ((NCP.ValidLinkP
										 CardOrLink)
									       (
							     NCHACKS.MakeLinkIconForLinkInvisible
										 CardOrLink 
										 Invisibility)))))))

(NCHACKS.MakeLinkIconsInvisibleInTextCard
  [LAMBDA (Card Invisibility)                                (* rht: "18-Jul-86 21:54")

          (* * Make any link icons appearing in Card invisible or visible according to whether Invisibility is ON or OFF.)


    (if (NCP.TextBasedP Card)
	then (LET ((WasActiveFlg (NCP.CardCachedP Card))
		     TextStream)
		    (if (NOT WasActiveFlg)
			then (NCP.CacheCards Card))
		    (SETQ TextStream (NCP.CardSubstance Card))
		    (for LinkPair in (CAR (NCP.ApplyCardTypeFn CollectLinksFn Card NIL T T))
		       do (NCHACKS.MakeTEditCharInvisible TextStream (CDR LinkPair)
							      Invisibility))
		    (if (NOT WasActiveFlg)
			then (NCP.UncacheCards Card])

(NCHACKS.MakeLinkIconForLinkInvisible
  [LAMBDA (Link Invisibility)                                (* rht: "18-Jul-86 21:54")

          (* * Make any link icons appearing in Card invisible or visible according to whether Invisibility is ON or OFF.)


    (LET ((Card (NCP.LinkSource Link)))
         (if (NCP.TextBasedP Card)
	     then (LET ((WasActiveFlg (NCP.CardCachedP Card))
			  TextStream)
		         (if (NOT WasActiveFlg)
			     then (NCP.CacheCards Card))
		         (SETQ TextStream (NCP.CardSubstance Card))
		         (for LinkPair in (CAR (NCP.ApplyCardTypeFn CollectLinksFn Card NIL NIL 
									  T))
			    when (NC.SameLinkP Link (CAR LinkPair)) do (
								   NCHACKS.MakeTEditCharInvisible
										 TextStream
										 (CDR LinkPair)
										 Invisibility))
		         (if (NOT WasActiveFlg)
			     then (NCP.UncacheCards Card])

(NCHACKS.MakeTEditCharInvisible
  (LAMBDA (TextStream Loc Invisibility)                      (* rht: "18-Jul-86 21:55")

          (* * Make whatever char is at Loc be invisible or visible according to whether Invisibility is ON or OFF.)


    (TEDIT.LOOKS TextStream (BQUOTE (INVISIBLE , Invisibility))
		   (TEDIT.SETSEL TextStream Loc 1 (QUOTE LEFT)))))
)
(PUTPROPS NCHACKS COPYRIGHT ("Xerox Corporation" 1985 1986 1987))
(DECLARE: DONTCOPY
  (FILEMAP (NIL (1511 7368 (NCHACKS.GlobalTextReplace 1521 . 2640) (NCHACKS.TextSearch 2642 . 4313) (
NCHACKS.GlobalTextReplaceInCard 4315 . 5534) (NCHACKS.TextSearchInCard 5536 . 7366)) (7419 8957 (
NCHACKS.RemoveDeletedIconsFromTextCards 7429 . 8025) (NCHACKS.RemoveDeletedIconsFromTextCard 8027 . 
8955)) (9001 13279 (NCHACKS.ReorderLinkIconsInTextCards 9011 . 10079) (
NCHACKS.ReorderLinkIconsInTextCard 10081 . 13277)) (13347 16389 (NCHACKS.DateSearch 13357 . 14524) (
NCHACKS.DateSearchInCard 14526 . 16387)) (16479 19919 (NCHACKS.CardsModifiedBetweenDates 16489 . 19917
)) (19984 20867 (NCHACKS.MakeChain 19994 . 20865)) (20921 24247 (NCHACKS.MakeLinkIconsInvisible 20931
 . 22089) (NCHACKS.MakeLinkIconsInvisibleInTextCard 22091 . 22885) (
NCHACKS.MakeLinkIconForLinkInvisible 22887 . 23859) (NCHACKS.MakeTEditCharInvisible 23861 . 24245))))
)
STOP