1
/*___INFO__MARK_BEGIN__*/
2
/*************************************************************************
4
* The Contents of this file are made available subject to the terms of
5
* the Sun Industry Standards Source License Version 1.2
7
* Sun Microsystems Inc., March, 2001
10
* Sun Industry Standards Source License Version 1.2
11
* =================================================
12
* The contents of this file are subject to the Sun Industry Standards
13
* Source License Version 1.2 (the "License"); You may not use this file
14
* except in compliance with the License. You may obtain a copy of the
15
* License at http://gridengine.sunsource.net/Gridengine_SISSL_license.html
17
* Software provided under this License is provided on an "AS IS" basis,
18
* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
19
* WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
20
* MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
21
* See the License for the specific provisions governing your rights and
22
* obligations concerning the Software.
24
* The Initial Developer of the Original Code is: Sun Microsystems, Inc.
26
* Copyright: 2001 by Sun Microsystems, Inc.
28
* All Rights Reserved.
30
************************************************************************/
31
/*___INFO__MARK_END__*/
40
#include <Xmt/Create.h>
41
#include <Xmt/Layout.h>
42
#include <Xmt/Chooser.h>
43
#include <Xmt/Dialog.h>
44
#include <Xmt/Dialogs.h>
45
#include <Xmt/MsgLine.h>
46
#include <Xmt/InputField.h>
48
#include "sge_all_listsL.h"
49
#include "gdi/sge_gdi.h"
50
#include "sge_answer.h"
51
#include "sge_userprj.h"
53
#include "qmon_proto.h"
54
#include "qmon_rmon.h"
55
#include "qmon_cull.h"
56
#include "qmon_util.h"
57
#include "qmon_appres.h"
58
#include "qmon_timer.h"
59
#include "qmon_comm.h"
60
#include "qmon_widgets.h"
61
#include "qmon_message.h"
62
#include "qmon_project.h"
63
#include "qmon_globals.h"
64
#include "AskForItems.h"
67
static Widget qmon_project = 0;
68
static Widget project_names = 0;
69
static Widget project_conf_list = 0;
70
static Widget project_ask_layout = 0;
71
static Widget project_name_w = 0;
72
static Widget project_acl_w = 0;
73
static Widget project_xacl_w = 0;
74
static int add_mode = 0;
76
/*-------------------------------------------------------------------------*/
77
static void qmonPopdownProjectConfig(Widget w, XtPointer cld, XtPointer cad);
78
static Widget qmonCreateProjectConfig(Widget parent);
79
static void qmonProjectFillConf(Widget w, lListElem *ep);
80
static void qmonSelectProject(Widget w, XtPointer cld, XtPointer cad);
81
static void qmonProjectAdd(Widget w, XtPointer cld, XtPointer cad);
82
static void qmonProjectModify(Widget w, XtPointer cld, XtPointer cad);
83
static void qmonProjectDelete(Widget w, XtPointer cld, XtPointer cad);
84
static void qmonProjectOk(Widget w, XtPointer cld, XtPointer cad);
85
static void qmonProjectCancel(Widget w, XtPointer cld, XtPointer cad);
86
static void qmonProjectResetAsk(void);
87
static void qmonProjectSetAsk(lListElem *prjp);
88
static Widget qmonCreateProjectAsk(Widget parent);
89
static Boolean qmonProjectGetAsk(lListElem *prjp);
90
static void qmonProjectAskForUsers(Widget w, XtPointer cld, XtPointer cad);
92
/*-------------------------------------------------------------------------*/
93
void qmonPopupProjectConfig(Widget w, XtPointer cld, XtPointer cad)
97
DENTER(GUI_LAYER, "qmonPopupProjectConfig");
100
XmtDisplayBusyCursor(w);
103
shell = XmtGetTopLevelShell(w);
104
qmon_project = qmonCreateProjectConfig(shell);
105
XmtAddDeleteCallback(shell, XmDO_NOTHING,
106
qmonPopdownProjectConfig, NULL);
110
project_ask_layout = qmonCreateProjectAsk(qmon_project);
113
XSync(XtDisplay(qmon_project), 0);
114
XmUpdateDisplay(qmon_project);
116
qmonTimerAddUpdateProc(PROJECT_T, "updateProjectList", updateProjectList);
117
qmonStartTimer(PROJECT_T | USERSET_T);
119
XmListSelectPos(project_names, 1, True);
121
XtManageChild(qmon_project);
122
XRaiseWindow(XtDisplay(XtParent(qmon_project)),
123
XtWindow(XtParent(qmon_project)));
125
/* set default cursor */
126
XmtDisplayDefaultCursor(w);
131
/*-------------------------------------------------------------------------*/
132
void updateProjectList(void)
136
DENTER(GUI_LAYER, "updateProjectList");
138
cl = qmonMirrorList(SGE_PROJECT_LIST);
139
lPSortList(cl, "%I+", PR_name);
140
UpdateXmListFromCull(project_names, XmFONTLIST_DEFAULT_TAG, cl, PR_name);
146
/*-------------------------------------------------------------------------*/
147
static void qmonPopdownProjectConfig(Widget w, XtPointer cld, XtPointer cad)
149
DENTER(GUI_LAYER, "qmonPopdownProjectConfig");
151
XtUnmanageChild(qmon_project);
152
qmonStopTimer(PROJECT_T | USERSET_T);
153
qmonTimerRmUpdateProc(PROJECT_T, "updateProjectList");
158
/*-------------------------------------------------------------------------*/
159
static void qmonProjectFillConf(
170
DENTER(GUI_LAYER, "qmonProjectFillConf");
174
** clear the project_conf_list
176
XtVaSetValues( project_conf_list,
185
items = (XmString*) XtMalloc(sizeof(XmString)*itemCount);
190
sprintf(buf, "%-20.20s %s", "Project Name", lGetString(ep, PR_name));
191
items[i++] = XmStringCreateLtoR(buf, "LIST");
193
/* Override Tickets */
194
sprintf(buf, "%-20.20s %d", "Override Tickets",
195
(int)lGetUlong(ep, PR_oticket));
196
items[i++] = XmStringCreateLtoR(buf, "LIST");
199
sprintf(buf, "%-20.20s %d", "Functional Share",
200
(int)lGetUlong(ep, PR_fshare));
201
items[i++] = XmStringCreateLtoR(buf, "LIST");
204
ul = lGetList(ep, PR_acl);
205
sprintf(buf, "%-20.20s", "Users");
208
strcat(buf, lGetString(uep, US_name));
210
if (!lGetNumberOfElem(ul))
211
strcat(buf, " NONE");
212
items[i++] = XmStringCreateLtoR(buf, "LIST");
215
ul = lGetList(ep, PR_xacl);
216
sprintf(buf, "%-20.20s", "Xusers");
219
strcat(buf, lGetString(uep, US_name));
221
if (!lGetNumberOfElem(ul))
222
strcat(buf, " NONE");
223
items[i++] = XmStringCreateLtoR(buf, "LIST");
225
XtVaSetValues( project_conf_list,
227
XmNitemCount, itemCount,
229
XmStringTableFree(items, itemCount);
234
/*-------------------------------------------------------------------------*/
235
static void qmonSelectProject(Widget w, XtPointer cld, XtPointer cad)
237
XmListCallbackStruct *cbs = (XmListCallbackStruct*) cad;
241
DENTER(GUI_LAYER, "qmonSelectProject");
243
if (! XmStringGetLtoR(cbs->item, XmFONTLIST_DEFAULT_TAG, &prjname)) {
244
fprintf(stderr, "XmStringGetLtoR failed\n");
249
ep = prj_list_locate(qmonMirrorList(SGE_PROJECT_LIST), prjname);
251
XtFree((char*) prjname);
253
qmonProjectFillConf(project_conf_list, ep);
259
/*-------------------------------------------------------------------------*/
260
static Widget qmonCreateProjectConfig(
263
Widget project_layout, project_add, project_delete, project_modify,
264
project_done, project_main_link;
266
DENTER(GUI_LAYER, "qmonCreateProjectConfig");
268
project_layout = XmtBuildQueryDialog( parent, "qmon_project",
270
"project_names", &project_names,
271
"project_conf_list", &project_conf_list,
272
"project_add", &project_add,
273
"project_delete", &project_delete,
274
"project_done", &project_done,
275
"project_modify", &project_modify,
276
"project_main_link", &project_main_link,
279
XtAddCallback(project_names, XmNbrowseSelectionCallback,
280
qmonSelectProject, NULL);
281
XtAddCallback(project_done, XmNactivateCallback,
282
qmonPopdownProjectConfig, NULL);
283
XtAddCallback(project_add, XmNactivateCallback,
284
qmonProjectAdd, NULL);
285
XtAddCallback(project_modify, XmNactivateCallback,
286
qmonProjectModify, NULL);
287
XtAddCallback(project_delete, XmNactivateCallback,
288
qmonProjectDelete, NULL);
289
XtAddCallback(project_main_link, XmNactivateCallback,
290
qmonMainControlRaise, NULL);
292
XtAddEventHandler(XtParent(project_layout), StructureNotifyMask, False,
293
SetMinShellSize, NULL);
294
XtAddEventHandler(XtParent(project_layout), StructureNotifyMask, False,
295
SetMaxShellSize, NULL);
298
return project_layout;
303
/*-------------------------------------------------------------------------*/
304
static Widget qmonCreateProjectAsk(
307
Widget project_ok, project_cancel, project_usersPB, project_xusersPB;
309
DENTER(GUI_LAYER, "qmonCreateProjectAsk");
311
project_ask_layout = XmtBuildQueryDialog( parent, "project_ask_shell",
313
"project_ok", &project_ok,
314
"project_cancel", &project_cancel,
315
"project_usersPB", &project_usersPB,
316
"project_xusersPB", &project_xusersPB,
317
"project_name", &project_name_w,
318
"project_users", &project_acl_w,
319
"project_xusers", &project_xacl_w,
322
XtAddCallback(project_ok, XmNactivateCallback,
323
qmonProjectOk, NULL);
324
XtAddCallback(project_cancel, XmNactivateCallback,
325
qmonProjectCancel, NULL);
326
XtAddCallback(project_usersPB, XmNactivateCallback,
327
qmonProjectAskForUsers, (XtPointer)project_acl_w);
328
XtAddCallback(project_xusersPB, XmNactivateCallback,
329
qmonProjectAskForUsers, (XtPointer)project_xacl_w);
331
XtAddEventHandler(XtParent(project_ask_layout), StructureNotifyMask, False,
332
SetMinShellSize, NULL);
335
return project_ask_layout;
338
/*-------------------------------------------------------------------------*/
339
static void qmonProjectAskForUsers(Widget w, XtPointer cld, XtPointer cad)
341
lList *ql_out = NULL;
344
Widget list = (Widget) cld;
346
DENTER(GUI_LAYER, "qmonProjectAskForUsers");
348
ql_in = qmonMirrorList(SGE_USERSET_LIST);
349
lPSortList(ql_in, "%I+", US_name);
350
ql_out = XmStringToCull(list, US_Type, US_name, ALL_ITEMS);
352
status = XmtAskForItems(w, NULL, NULL, "@{Select Access Lists}",
354
"@{@fBAvailable Access Lists}", &ql_out, US_Type, US_name,
355
"@{@fBChosen Access Lists}", NULL);
358
lPSortList(ql_out, "%I+", US_name);
359
UpdateXmListFromCull(list, XmFONTLIST_DEFAULT_TAG, ql_out,
367
/*-------------------------------------------------------------------------*/
368
static void qmonProjectAdd(Widget w, XtPointer cld, XtPointer cad)
370
DENTER(GUI_LAYER, "qmonProjectAdd");
372
qmonProjectResetAsk();
373
XtVaSetValues( project_name_w,
377
XtManageChild(project_ask_layout);
382
/*-------------------------------------------------------------------------*/
383
static void qmonProjectModify(Widget w, XtPointer cld, XtPointer cad)
388
lListElem *prjp = NULL;
390
DENTER(GUI_LAYER, "qmonProjectModify");
393
** on opening the dialog fill in the old values
395
XtVaGetValues( project_names,
396
XmNselectedItems, &prjnames,
397
XmNselectedItemCount, &prjnum,
401
XmStringGetLtoR(prjnames[0], XmFONTLIST_DEFAULT_TAG, &prjstr)) {
402
XmtInputFieldSetString(project_name_w, prjstr);
403
XtVaSetValues( project_name_w,
406
prjp = prj_list_locate(qmonMirrorList(SGE_PROJECT_LIST), prjstr);
407
XtFree((char*)prjstr);
410
qmonProjectSetAsk(prjp);
411
XtManageChild(project_ask_layout);
413
XtManageChild(project_ask_layout);
417
qmonMessageShow(w, True, "@{Select only one project !}");
419
qmonMessageShow(w, True, "@{To modify a project select this project !}");
428
/*-------------------------------------------------------------------------*/
429
static void qmonProjectOk(Widget w, XtPointer cld, XtPointer cad)
433
lEnumeration *what = NULL;
434
Boolean status = False;
435
XmString xprjname = NULL;
436
StringConst prjname = NULL;
437
lListElem *new_prep = NULL;
438
lListElem *prep = NULL;
440
DENTER(GUI_LAYER, "qmonProjectOk");
442
** get the contents of the dialog fields here,
443
** build the cull list and send gdi request
444
** depending on success of gdi request close the dialog or stay open
446
prjl = lCreateList("PR_ADD", PR_Type);
447
prep = lCreateElem(PR_Type);
450
if (qmonProjectGetAsk(prep)) {
451
prjname = lGetString(prep, PR_name);
455
what = lWhat("%T(ALL)", PR_Type);
458
lAppendElem(prjl, lCopyElem(prep));
459
alp = qmonAddList(SGE_PROJECT_LIST,
460
qmonMirrorListRef(SGE_PROJECT_LIST),
461
PR_name, &prjl, NULL, what);
465
** find old element and change this one because we have to keep
466
** the information inside it; due to a weakness of the
467
** current GDI a selective modify is impossible
469
qmonMirrorMultiAnswer(PROJECT_T, &alp);
471
qmonMessageBox(w, alp, 0);
477
new_prep = lCopyElem(lGetElemStr(qmonMirrorList(SGE_PROJECT_LIST),
479
lSwapList(new_prep, PR_acl, prep, PR_acl);
480
lSwapList(new_prep, PR_xacl, prep, PR_xacl);
481
lAppendElem(prjl, new_prep);
482
alp = qmonModList(SGE_PROJECT_LIST,
483
qmonMirrorListRef(SGE_PROJECT_LIST),
484
PR_name, &prjl, NULL, what);
487
if (lFirst(alp) && lGetUlong(lFirst(alp), AN_status) == STATUS_OK)
490
qmonMessageBox(w, alp, 0);
493
XtUnmanageChild(project_ask_layout);
496
XmListSelectPos(project_names, 0, True);
499
xprjname = XmtCreateXmString(prjname);
500
XmListSelectItem(project_names, xprjname, True);
501
XmStringFree(xprjname);
517
/*-------------------------------------------------------------------------*/
518
static void qmonProjectCancel(Widget w, XtPointer cld, XtPointer cad)
520
DENTER(GUI_LAYER, "qmonProjectCancel");
522
XtUnmanageChild(project_ask_layout);
527
/*-------------------------------------------------------------------------*/
528
static void qmonProjectDelete(Widget w, XtPointer cld, XtPointer cad)
532
lEnumeration *what = NULL;
533
Cardinal itemCount = 0;
534
Boolean status, answer;
536
DENTER(GUI_LAYER, "qmonProjectDelete");
538
lp = XmStringToCull(project_names, PR_Type, PR_name, SELECTED_ITEMS);
541
status = XmtAskForBoolean(w, "xmtBooleanDialog",
542
"@{project.askdel.Do you really want to delete the\nselected Project Configuration ?}",
543
"@{Delete}", "@{Cancel}", NULL, XmtNoButton, XmDIALOG_WARNING,
544
False, &answer, NULL);
546
what = lWhat("%T(ALL)", PR_Type);
547
alp = qmonDelList(SGE_PROJECT_LIST,
548
qmonMirrorListRef(SGE_PROJECT_LIST),
549
PR_name, &lp, NULL, what);
551
qmonMessageBox(w, alp, 0);
556
XtVaGetValues( project_names,
557
XmNitemCount, &itemCount,
560
XmListSelectPos(project_names, 1, True);
562
qmonProjectFillConf(project_names, NULL);
570
/*-------------------------------------------------------------------------*/
571
static void qmonProjectSetAsk(
574
StringConst prj_name = NULL;
578
DENTER(GUI_LAYER, "qmonProjectSetAsk");
585
prj_name = lGetString(prjp, PR_name);
587
XmtInputFieldSetString(project_name_w, prj_name);
590
** the lists have to be converted to XmString
592
acl = lGetList(prjp, PR_acl);
593
UpdateXmListFromCull(project_acl_w, XmFONTLIST_DEFAULT_TAG, acl, US_name);
595
xacl = lGetList(prjp, PR_xacl);
596
UpdateXmListFromCull(project_xacl_w, XmFONTLIST_DEFAULT_TAG, xacl, US_name);
601
/*-------------------------------------------------------------------------*/
602
static void qmonProjectResetAsk(void)
605
DENTER(GUI_LAYER, "qmonProjectResetAsk");
607
XmtInputFieldSetString(project_name_w, "");
610
** the lists have to be converted to XmString
612
UpdateXmListFromCull(project_acl_w, XmFONTLIST_DEFAULT_TAG, NULL, US_name);
614
UpdateXmListFromCull(project_xacl_w, XmFONTLIST_DEFAULT_TAG, NULL, US_name);
619
/*-------------------------------------------------------------------------*/
620
static Boolean qmonProjectGetAsk(
623
String prj_name = NULL;
627
DENTER(GUI_LAYER, "qmonProjectGetAsk");
634
prj_name = XmtInputFieldGetString(project_name_w);
635
if (!prj_name || prj_name[0] == '\0') {
636
qmonMessageShow(project_ask_layout, True, "@{Project name required !}");
640
lSetString(prjp, PR_name, prj_name);
643
** XmString entries --> Cull
645
acl = XmStringToCull(project_acl_w, US_Type, US_name, ALL_ITEMS);
646
lSetList(prjp, PR_acl, acl);
648
xacl = XmStringToCull(project_xacl_w, US_Type, US_name, ALL_ITEMS);
649
lSetList(prjp, PR_xacl, xacl);