Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 12 Jan 2000 15:24:30 -0500
From:      David Quattlebaum <David.Quattlebaum@sas.com>
To:        "'mi@aldan.algebra.com'" <mi@aldan.algebra.com>, 'FreeBSD Hackers' <freebsd-hackers@freebsd.org>
Subject:   XPostitPlus-2.3 patch file
Message-ID:  <5FA575D78630D3118B2E0090276DC89F01B592AF@merc08.us.sas.com>

next in thread | raw e-mail | index | archive | help
Below is a patch file that adds functionality to XPostitPlus-2.3 that
I find useful. The patch file adds the following new things.

1) Adds a new "Hide All Notes" menu selection.
   Files changed are xpostit.h, menu.c, note.c

2) Makes the "Find a Note" window bigger, but not too large.

   File changed is findnote.c
   This works fine with my Dell 21" monitor, your mileage 
   may vary. Comments welcome.

3) Sort all notes by title. This helps with "Find a note".
   
   Files changed are xpostit.h, note.c
   For sorting, I changed the notes list to a doubly-linked list and
   implemented a new MoveNote() function that will move a note to it's
   sorted order. CompareNotes() is used to compare one note with another
   in regards to sorted order. CompareNotes() also handles the "Note 2"
   before "Note 10" problem correctly.


This has been built on a FreeBSD 4.0-19991223-SNAP system.

--------------------8< cut-here -------------------------------------
--- xpostit.h.orig Sat Sep 14 23:59:14 1996
+++ xpostit.h      Tue Jan 11 21:15:32 2000
@@ -245,2 +245,3 @@
 	struct	_PostItNote *pn_next;	/* pointer to next note record	*/
+       struct  _PostItNote *pn_prev;   /* pointer to prev note record  */
 } PostItNote;
@@ -335,2 +336,3 @@
 void	UnHideAllNotes();
+void	HideAllNotes();
 void	LowerAllNotes();

--- findnote.c.orig  Fri Apr 12 13:51:30 1996
+++ findnote.c       Sat Jan  8 13:46:51 2000
@@ -219,3 +219,3 @@
	nargs = 0;
-	SetArg(XtNheight, 100);
+	SetArg(XtNheight, (int)((i>39) ? 839 : i*21.5)); 
	SetArg(XtNwidth, 200);

--- menu.c.orig Tue May  7 16:02:32 1996
+++ menu.c      Sat Jan  8 10:51:53 2000
@@ -69,11 +69,13 @@
	"Unhide All Notes",
-#define MenuCascade		12
+#define MenuHideAll		12
+	"Hide All Notes",
+#define MenuCascade		13
	"Cascade Notes",
-#define MenuFindANote		13
+#define MenuFindANote		14
	"Find A Note",
-#define EndNoteFunctions	14
+#define EndNoteFunctions	15
	" ",
-#define MenuExit		15
+#define MenuExit		16
	"Exit",
-#define MenuLastEntry		16
+#define MenuLastEntry		17
	0,
@@ -182,2 +184,5 @@
		UnHideAllNotes();
+		break;
+	case MenuHideAll:
+		HideAllNotes();
		break;

--- note.c.orig	Sat Sep 14 19:31:30 1996
+++ note.c	Wed Jan 12 14:37:21 2000
@@ -112,2 +112,4 @@
 static PostItNote	*AllocNote();
+static PostItNote	*MoveNote();
+static int       	CompareNotes();
 
@@ -213,2 +215,3 @@
 	pn = AllocNote(NewIndex);
+	pn = MoveNote(pn);
 
@@ -369,2 +372,6 @@
 		 * Get a note structure.
+                 * we will allocate this note, 
+                 * put it on the note chain,
+                 * when we have finished filling it in, we
+                 *    will put note in sorted order.
 		 */
@@ -439,2 +446,8 @@
 
+                /*
+                 * Move this note to it's sorted order 
+                 * sorted by title (or note number)
+                 */
+                MoveNote(pn);
+
 		/*
@@ -490,2 +503,24 @@
 
+/* 
+ * HideAllNotes - hide all unhidden notes
+ */
+void
+HideAllNotes()
+{ 
+	register PostItNote *pn;
+	Boolean found;
+ 
+	found = False;
+	for (pn = notes; pn != NULL; pn = pn->pn_next)
+		if ( pn->pn_hidden == False)
+		{
+			XtPopdown ( pn->pn_shellwidget );
+			pn->pn_hidden = True;
+			found = True;
+		}
+ 
+	if ( !found )
+		ErrPopUp("There are no notes to hide.");
+}
+
 /*
@@ -1590,2 +1625,3 @@
 	NameIt(pn, confirm, cancel);
+
 }
@@ -1841,2 +1877,8 @@
 		XtSetSensitive ( pn->pn_savewidget, True );
+
+		/*
+		 * Move the note to it's proper sorted order
+		 */
+		MoveNote(pn);
+
 	}
@@ -2001,4 +2043,3 @@
 	/*
-	 * Allocate a structure.
-	 */
+	 * Allocate a structure.  */
 	if (notes == NULL) {
@@ -2006,2 +2047,3 @@
 		pn = notes;
+		pn->pn_prev = NULL;
 	}
@@ -2012,2 +2054,3 @@
 		pn->pn_next = (PostItNote *) SafeAlloc(sizeof(PostItNote));
+		pn->pn_next->pn_prev = pn;
 		pn = pn->pn_next;
@@ -2063,2 +2106,107 @@
 	return(NULL);
+}
+
+/*
+ * MoveNote - move the given note to it's sorted position in
+ *	      list of notes. The sort field is pn_name.
+ *            
+ *            When a note is added, it is always added to
+ *            the end of the list.
+ */
+static PostItNote *
+MoveNote(note)
+PostItNote *note;
+{
+	register PostItNote	*pn, *prevn;
+
+        /*
+         * If first and only note, return
+         */
+        if (notes == note && note->pn_next == NULL ) 
+		return(note);
+
+        /* 
+         * then remove note
+         */
+	/* if last note */
+        if (note->pn_next == NULL)
+		note->pn_prev->pn_next = NULL;
+        /* if first note */
+	else if (note->pn_prev == NULL) {
+		note->pn_next->pn_prev = NULL;
+                notes = note->pn_next;
+	}
+        /* else in middle of list */
+        else {
+		note->pn_prev->pn_next = note->pn_next;
+		note->pn_next->pn_prev = note->pn_prev;
+	}
+        note->pn_prev = note->pn_next = NULL;
+
+        /*
+         * find first note with name greater than or equal to this
+         * note
+         */
+        for (pn = notes; pn != NULL; prevn = pn, pn = pn->pn_next) {
+                if (CompareNotes(pn, note) >= 0) {
+			/* if we are inserting at beginning of list */
+			if (pn == notes) {
+				notes = note; 
+			}
+			else {
+				pn->pn_prev->pn_next = note; 
+                  		note->pn_prev = pn->pn_prev;
+			}
+			note->pn_next = pn;
+			pn->pn_prev = note;
+                        break;
+                }
+        }
+
+        /*
+         * if pn is NULL, we have the greatest name so far
+         */
+        if (pn == NULL) {
+		prevn->pn_next = note;
+		note->pn_next = NULL;
+		note->pn_prev = prevn;
+        }
+
+	return(note);
+}
+
+/*
+ * CompareNotes - Compare one note with another and
+ *               return -1, 0 or 1
+ */
+static int
+CompareNotes(na, nb)
+PostItNote *na, *nb;
+{
+	int rc;
+
+	/*
+	 * Let's first see if we are comparing, Say,
+         * "Note 2" against "Note 10". For this type
+	 * of compare, we need a numeric compare, so
+	 * we don't end up with a bad placement (like ls)
+         */
+	if ((strncmp("Note ", na->pn_name, 5) == 0)
+	&&  (strncmp("Note ", nb->pn_name, 5) == 0)) {
+                int numa = atoi(&na->pn_name[5]);
+                int numb = atoi(&nb->pn_name[5]);
+		if (numa > numb)
+			rc = 1;
+		else if (numa < numb)
+			rc = -1; 
+		else
+			rc = 0; 
+	}
+	/*
+	 * Else let's just do an Alpha compare
+	 */
+	else
+		rc = strcasecmp(na->pn_name, nb->pn_name);
+
+	return(rc);
 }

--
David Quattlebaum, (david.quattlebaum@sas.com)         <IXOYE>

"The early bird may get the worm, but the second mouse gets the cheese"


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?5FA575D78630D3118B2E0090276DC89F01B592AF>