/* * XmNap A Motif napster client * * Copyright (C) 2000 Mats Peterson * * 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; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Please send any comments/bug reports to * mats_peterson@swipnet.se (Mats Peterson) */ #include #include #include #include #include #include #include #include #include #include "main.h" #include "search.h" #include "util.h" static int link; static Widget searchDlg = NULL; static void SearchDlgDestroyCB(Widget w, XtPointer clientData, XmAnyCallbackStruct *cbs) { XmPushButtonCallbackStruct cbs2; cbs2.reason = XmCR_CANCEL; XtCallCallbacks(searchDlg, XmNcancelCallback, &cbs2); } static void DestroySearchDlg(void) { if (searchDlg) { XtRemoveCallback(XtParent(searchDlg), XmNdestroyCallback, (XtCallbackProc)SearchDlgDestroyCB, NULL); XtDestroyWidget(XtParent(searchDlg)); searchDlg = NULL; } } static void EntryFocusCB (Widget w, XtPointer clientData, XmAnyCallbackStruct *cbs) { XtVaSetValues(w, XmNcursorPositionVisible, True, NULL); } static void EntryLosingFocusCB (Widget w, XtPointer clientData, XmTextVerifyCallbackStruct *cbs) { XtVaSetValues(w, XmNcursorPositionVisible, False, NULL); } static void LinkCB(Widget w, XtPointer clientData, XtPointer cbs) { link = (int)clientData; } static void SearchDlgCB(Widget w, XtPointer clientData, XmAnyCallbackStruct *cbs) { if (cbs->reason == XmCR_OK) { XtFree(search.artist); XtFree(search.title); XtFree(search.minLink); XtFree(search.minBitrate); XtFree(search.minFreq); XtFree(search.maxFiles); search.artist = XmTextFieldGetString(XtNameToWidget(w, "*artist")); search.title = XmTextFieldGetString(XtNameToWidget(w, "*title")); search.minBitrate = XmTextFieldGetString(XtNameToWidget(w, "*bitRate")); search.minFreq = XmTextFieldGetString(XtNameToWidget(w, "*freq")); search.maxFiles = XmTextFieldGetString(XtNameToWidget(w, "*maxFiles")); search.minLink = XtMalloc(3); sprintf(search.minLink, "%d", link); } DestroySearchDlg(); if (cbs->reason == XmCR_OK) Search2(); } void SearchDlg() { String values[5]; Widget parent, rowCol, form, label, entry = NULL, linkMenu; Arg args[20]; XmString optLabel[11]; int i, j, n, columns[] = {35, 35, 10, 10, 10}; Dimension labelWidth, labelMaxWidth = 0; char labelName[20]; String entryName[] = {"artist", "title", "bitRate", "freq", "maxFiles"}; DestroySearchDlg(); parent = curFocus ? curFocus : topLevel; values[0] = search.artist; values[1] = search.title; values[2] = search.minBitrate; values[3] = search.minFreq; values[4] = search.maxFiles; link = atoi(search.minLink); n = 0; XtSetArg(args[n], XmNautoUnmanage, False); n++; XtSetArg(args[n], XmNdefaultPosition, False); n++; XtSetArg(args[n], XmNnoResize, True); n++; XtSetArg(args[n], XmNmessageAlignment, XmALIGNMENT_CENTER); n++; searchDlg = XmCreateTemplateDialog(parent, "searchDlg", args, n); rowCol = XtVaCreateManagedWidget("rowCol", xmRowColumnWidgetClass, searchDlg, XmNmarginWidth, 5, NULL); for (i = 0; i < 6; i++) { form = XtVaCreateWidget("form", xmFormWidgetClass, rowCol, NULL); sprintf(labelName, "label_%d", i); n = 0; XtSetArg(args[n], XmNalignment, XmALIGNMENT_BEGINNING); n++; XtSetArg(args[n], XmNmarginHeight, 6); n++; XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++; label = XmCreateLabel(form, labelName, args, n); XtManageChild(label); XtVaGetValues(label, XmNwidth, &labelWidth, NULL); if (labelWidth > labelMaxWidth) labelMaxWidth = labelWidth; if (i == 5) { for (j = 0; j < 11; j++) optLabel[j] = XmStringCreateLocalized (linkStr[j]); linkMenu = XmVaCreateSimpleOptionMenu (form, "linkMenu", NULL, 0, atoi(search.minLink), LinkCB, XmVaPUSHBUTTON, optLabel[0], NULL, NULL, NULL, XmVaPUSHBUTTON, optLabel[1], NULL, NULL, NULL, XmVaPUSHBUTTON, optLabel[2], NULL, NULL, NULL, XmVaPUSHBUTTON, optLabel[3], NULL, NULL, NULL, XmVaPUSHBUTTON, optLabel[4], NULL, NULL, NULL, XmVaPUSHBUTTON, optLabel[5], NULL, NULL, NULL, XmVaPUSHBUTTON, optLabel[6], NULL, NULL, NULL, XmVaPUSHBUTTON, optLabel[7], NULL, NULL, NULL, XmVaPUSHBUTTON, optLabel[8], NULL, NULL, NULL, XmVaPUSHBUTTON, optLabel[9], NULL, NULL, NULL, XmVaPUSHBUTTON, optLabel[10], NULL, NULL, NULL, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, label, XmNleftOffset, 20, XmNmarginWidth, 0, XmNmarginHeight, 0, NULL); for (j = 0; j < 11; j++) XmStringFree(optLabel[j]); XtUnmanageChild(XtNameToWidget(linkMenu, "OptionLabel")); XtManageChild (linkMenu); } else { n = 0; XtSetArg(args[n], XmNcursorPositionVisible, False); n++; XtSetArg(args[n], XmNmarginWidth, 5); n++; XtSetArg(args[n], XmNmarginHeight, 2); n++; XtSetArg(args[n], XmNcolumns, columns[i]); n++; XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); n++; XtSetArg(args[n], XmNleftWidget, label); n++; XtSetArg(args[n], XmNleftOffset, 20); n++; entry = XmCreateTextField(form, entryName[i], args, n); XtManageChild(entry); XmTextSetString(entry, values[i]); XtAddCallback(entry, XmNfocusCallback, (XtCallbackProc)EntryFocusCB, NULL); XtAddCallback(entry, XmNlosingFocusCallback, (XtCallbackProc)EntryLosingFocusCB, NULL); } XtManageChild(form); } for (i = 0; i < 6; i++) { sprintf(labelName, "form.label_%d", i); XtVaSetValues(XtNameToWidget(rowCol, labelName), XmNwidth, labelMaxWidth, NULL); } XtAddCallback(searchDlg, XmNokCallback, (XtCallbackProc)SearchDlgCB, NULL); XtAddCallback(searchDlg, XmNcancelCallback, (XtCallbackProc)SearchDlgCB, NULL); XmAddWMProtocolCallback(XtParent(searchDlg), XmInternAtom(XtDisplay(searchDlg), "WM_DELETE_WINDOW", False), (XtCallbackProc)SearchDlgCB, NULL); XtAddCallback(XtParent(searchDlg), XmNdestroyCallback, (XtCallbackProc)SearchDlgDestroyCB, NULL); XtVaSetValues(searchDlg, XmNinitialFocus, rowCol, NULL); CenterDialog(searchDlg); } .