/* * Copyright (c) 1996 Michael J. Hammel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * findnote.c - routines to handle the alarm feature. * */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include "xpostit.h" /* globals */ /* local variables */ Widget find_widget, find_viewport, find_viewform; /* external variables */ extern Widget toplevel; /* external routines */ extern void ErrPopUp(); /* prototypes */ void FindPopDown(); void FindPopUpChild(); /* * CreateFindNotePrompt - create a scrollable window in which * all notes can be listed */ void CreateFindNotePrompt(notes, hidden) PostItNote *notes; Boolean hidden; { Arg args[15]; register int nargs; XtCallbackRec callbacks[2]; Boolean first; Widget entry[DefaultMaxNotes]; Widget find_form, find_cancel; PostItNote *pn; Window root, child; unsigned int buttons; int root_x, root_y, child_x, child_y; int maxwidth, i, last; Dimension width; /* get mouse location */ XQueryPointer(display, XtWindow(toplevel), &root, &child, &root_x, &root_y, &child_x, &child_y, &buttons); /* * Create a popup shell widget */ nargs = 0; if ( hidden ) { SetArg(XtNtitle, PostItNoteList); } else { SetArg(XtNtitle, PostItFindPrompt); } SetArg(XtNx, root_x); SetArg(XtNy, root_y); find_widget = XtCreatePopupShell( "FindShell", transientShellWidgetClass, toplevel, args, nargs); /* the form inside which all other windows will be put */ nargs = 0; SetArg(XtNborderWidth, 0); find_form = XtCreateManagedWidget( "FindForm", formWidgetClass, find_widget, args, nargs); /* the scrollable window */ nargs = 0; SetArg(XtNallowHoriz, TRUE); SetArg(XtNallowVert, TRUE); SetArg(XtNuseBottom, TRUE); find_viewport = XtCreateManagedWidget( "FindViewport", viewportWidgetClass, find_form, args, nargs); /* * create the form inside which all the buttons go */ nargs = 0; SetArg(XtNborderWidth, 0); find_viewform = XtCreateManagedWidget( "FindViewForm", formWidgetClass, find_viewport, args, nargs); /* now create each button */ first = True; maxwidth=0; i=0; for (pn = notes; pn != NULL; pn = pn->pn_next) { if ( hidden ) { if ( pn->pn_state == WithdrawnState) { nargs = 0; SetArg(XtNborderWidth, 1); SetArg(XtNlabel, pn->pn_name); SetArg(XtNshapeStyle, XmuShapeRectangle); SetArg(XtNhorizDistance, 0); if ( !first ) { SetArg(XtNfromVert, entry[i-1]); SetArg(XtNvertDistance, 0); } entry[i] = XtCreateManagedWidget( "FindButton", commandWidgetClass, find_viewform, args, nargs); XtAddCallback(entry[i], XtNcallback, FindPopUpChild, (XtPointer)pn); nargs = 0; SetArg(XtNwidth, &width); XtGetValues(entry[i], args, nargs); if (width>maxwidth) maxwidth=width; first=False; i++; } } else { nargs = 0; SetArg(XtNborderWidth, 1); SetArg(XtNlabel, pn->pn_name); SetArg(XtNshapeStyle, XmuShapeRectangle); SetArg(XtNhorizDistance, 0); if ( !first ) { SetArg(XtNfromVert, entry[i-1]); SetArg(XtNvertDistance, 0); } entry[i] = XtCreateManagedWidget( "FindButton", commandWidgetClass, find_viewform, args, nargs); XtAddCallback(entry[i], XtNcallback, FindPopUpChild, (XtPointer)pn); nargs = 0; SetArg(XtNwidth, &width); XtGetValues(entry[i], args, nargs); if (width>maxwidth) maxwidth=width; first=False; i++; } } if ( first ) { if ( hidden ) ErrPopUp("There are no hidden notes." ); else ErrPopUp("You have no notes."); FindPopDown(); return; } /* readjust the widths of all buttons */ last=i; for (i=0;i