pal_custdlg.c 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922
  1. /*
  2. * CDE - Common Desktop Environment
  3. *
  4. * Copyright (c) 1993-2012, The Open Group. All rights reserved.
  5. *
  6. * These libraries and programs are free software; you can
  7. * redistribute them and/or modify them under the terms of the GNU
  8. * Lesser General Public License as published by the Free Software
  9. * Foundation; either version 2 of the License, or (at your option)
  10. * any later version.
  11. *
  12. * These libraries and programs are distributed in the hope that
  13. * they will be useful, but WITHOUT ANY WARRANTY; without even the
  14. * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
  15. * PURPOSE. See the GNU Lesser General Public License for more
  16. * details.
  17. *
  18. * You should have received a copy of the GNU Lesser General Public
  19. * License along with these libraries and programs; if not, write
  20. * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
  21. * Floor, Boston, MA 02110-1301 USA
  22. */
  23. /*
  24. * $XConsortium: pal_custdlg.c /main/5 1996/08/08 17:59:53 mustafa $
  25. *
  26. * @(#)pal_custdlg.c 1.40 15 Feb 1994 cde_app_builder/src/ab
  27. *
  28. * RESTRICTED CONFIDENTIAL INFORMATION:
  29. *
  30. * The information in this document is subject to special
  31. * restrictions in a confidential disclosure agreement between
  32. * HP, IBM, Sun, USL, SCO and Univel. Do not distribute this
  33. * document outside HP, IBM, Sun, USL, SCO, or Univel without
  34. * Sun's specific written approval. This document and all copies
  35. * and derivative works thereof must be returned or destroyed at
  36. * Sun's request.
  37. *
  38. * Copyright 1993 Sun Microsystems, Inc. All rights reserved.
  39. *
  40. */
  41. /*
  42. * pal_custdlg.c - Implements Palette CustomDialog object functionality
  43. */
  44. #include <stdint.h>
  45. #include <stdio.h>
  46. #include <Xm/Xm.h>
  47. #include "dtb_utils.h"
  48. #include <ab_private/util.h>
  49. #include <ab_private/ab.h>
  50. #include <ab_private/pal.h>
  51. #include <ab_private/proj.h>
  52. #include <ab_private/prop.h>
  53. #include <ab_private/abobj.h>
  54. #include <ab_private/abobj_set.h>
  55. #include <ab_private/ui_util.h>
  56. #include "custdlg_ui.h"
  57. const int custdlg_init_height = 175;
  58. const int custdlg_init_width = 380;
  59. typedef struct PROP_CUSTDLG_SETTINGS
  60. {
  61. Widget prop_sheet;
  62. PropObjOptionsSettingRec win_parent;
  63. PropFieldSettingRec name;
  64. PropFieldSettingRec title;
  65. PropRadioSettingRec size_policy;
  66. PropGeometrySettingRec geometry;
  67. PropRadioSettingRec resize_mode;
  68. PropCheckboxSettingRec areas;
  69. PropObjOptionsSettingRec default_but;
  70. PropObjOptionsSettingRec help_but;
  71. PropCheckboxSettingRec init_state;
  72. PropColorSettingRec bg_color;
  73. PropColorSettingRec fg_color;
  74. ABObj current_obj;
  75. } PropCustdlgSettingsRec, *PropCustdlgSettings;
  76. /*************************************************************************
  77. ** **
  78. ** Private Function Declarations **
  79. ** **
  80. **************************************************************************/
  81. /*
  82. * Methods
  83. */
  84. static int custdlg_initialize(
  85. ABObj obj
  86. );
  87. static Widget custdlg_prop_init(
  88. Widget parent,
  89. AB_PROP_TYPE type
  90. );
  91. static int custdlg_prop_activate(
  92. AB_PROP_TYPE type,
  93. BOOL active
  94. );
  95. static int custdlg_prop_clear(
  96. AB_PROP_TYPE type
  97. );
  98. static int custdlg_prop_load(
  99. ABObj obj,
  100. AB_PROP_TYPE type,
  101. unsigned long loadkey
  102. );
  103. static int custdlg_prop_apply(
  104. AB_PROP_TYPE type
  105. );
  106. static BOOL custdlg_prop_pending(
  107. AB_PROP_TYPE type
  108. );
  109. static BOOL verify_props(
  110. AB_PROP_TYPE type
  111. );
  112. static void turnoff_changebars(
  113. AB_PROP_TYPE type
  114. );
  115. static void custdlg_create_area(
  116. ABObj obj,
  117. AB_CONTAINER_TYPE area_type
  118. );
  119. static void custdlg_create_buttons(
  120. ABObj obj,
  121. ABObj area
  122. );
  123. static void custdlg_remove_area(
  124. ABObj obj,
  125. ABObj area
  126. );
  127. static BOOL button_test_func(
  128. ABObj obj
  129. );
  130. static BOOL winparent_test_func(
  131. ABObj obj
  132. );
  133. /*************************************************************************
  134. ** **
  135. ** Data **
  136. ** **
  137. **************************************************************************/
  138. PalItemInfo custdlg_palitem_rec = {
  139. /* type */ AB_TYPE_DIALOG,
  140. /* name */ "Custom Dialog",
  141. /* animation pixmaps*/ NULL,
  142. /* number of pixmaps*/ 0,
  143. /* rev_prop_frame */ NULL,
  144. /* fix_prop_dialog */ NULL,
  145. /* initialize */ custdlg_initialize,
  146. /* is_a_test */ obj_is_popup_win,
  147. /* prop_initialize */ custdlg_prop_init,
  148. /* prop_activate */ custdlg_prop_activate,
  149. /* prop_clear */ custdlg_prop_clear,
  150. /* prop_load */ custdlg_prop_load,
  151. /* prop_apply */ custdlg_prop_apply,
  152. /* prop_pending */ custdlg_prop_pending
  153. };
  154. PalItemInfo *ab_custdlg_palitem = &custdlg_palitem_rec;
  155. PropCustdlgSettingsRec prop_custdlg_settings_rec[AB_PROP_TYPE_NUM_VALUES];
  156. /*************************************************************************
  157. ** **
  158. ** Function Definitions **
  159. ** **
  160. **************************************************************************/
  161. static int
  162. custdlg_initialize(
  163. ABObj obj
  164. )
  165. {
  166. ABObj module = obj_get_module(obj);
  167. ABObj win;
  168. ABObj apobj;
  169. int num_wins;
  170. int i;
  171. /* Find MainWindow to be Custom Dialog's Motif parent.
  172. * If none exist, window-parent will remain NULL
  173. */
  174. num_wins = obj_get_num_children(module);
  175. for (i = 0; i < num_wins; i++)
  176. {
  177. win = obj_get_child(module, i);
  178. if (obj_is_base_win(win))
  179. {
  180. obj_set_win_parent(obj, win);
  181. break;
  182. }
  183. }
  184. obj_set_unique_name(obj, "dialog");
  185. obj_set_label(obj, CATGETS(Dtb_project_catd, 100, 256, "Custom Dialog"));
  186. obj_set_bg_color(obj, "white");
  187. obj_set_is_initially_visible(obj, False);
  188. obj_set_is_initially_active(obj, True);
  189. obj_set_width(obj, custdlg_init_width);
  190. obj_set_height(obj, custdlg_init_height);
  191. /* Create Default Button Panel */
  192. apobj = obj_create(AB_TYPE_CONTAINER, obj);
  193. obj_set_subtype(apobj, AB_CONT_BUTTON_PANEL);
  194. pal_initialize_obj(apobj);
  195. /* Create Default Buttons for Button Panel */
  196. custdlg_create_buttons(obj, apobj);
  197. return OK;
  198. }
  199. static Widget
  200. custdlg_prop_init(
  201. Widget parent,
  202. AB_PROP_TYPE type
  203. )
  204. {
  205. DtbCustdlgPropDialogInfoRec rev_custdlg_prop_dialog; /* Revolving Props */
  206. DtbCustdlgPropDialogInfo cgen = &dtb_custdlg_prop_dialog; /* Codegen structure */
  207. DtbRevolvPropDialogInfo rpd = &(dtb_revolv_prop_dialog);
  208. PropCustdlgSettingsRec *pcs = &(prop_custdlg_settings_rec[type]);
  209. Widget item[6];
  210. XtArgVal item_val[6];
  211. XtPointer item_ptr[6];
  212. int i, n;
  213. if (type == AB_PROP_REVOLVING)
  214. {
  215. /* Cloning Trick:
  216. * Only the Attributes ControlPanel needs to be created within
  217. * the existing Revolving Prop dialog, so fill out all other
  218. * fields with the Revolving Prop dialog equivelents, so the
  219. * dtb initialize proc will skip those non-NULL fields...
  220. */
  221. dtbCustdlgPropDialogInfo_clear(&rev_custdlg_prop_dialog);
  222. cgen = &(rev_custdlg_prop_dialog);
  223. cgen->prop_dialog = rpd->prop_dialog;
  224. cgen->prop_dialog_shellform = rpd->prop_dialog_shellform;
  225. cgen->prop_dialog_panedwin = rpd->prop_dialog_panedwin;
  226. cgen->prop_dialog_form = rpd->prop_dialog_form;
  227. cgen->objlist_panel = rpd->objlist_panel;
  228. cgen->objlist_label = rpd->objlist_label2;
  229. cgen->objlist_scrolledwin = rpd->objlist_scrolledwin;
  230. cgen->objlist = rpd->objlist;
  231. cgen->attrs_ctrlpanel_frame = rpd->attrs_ctrlpanel_frame;
  232. cgen->activate_panel = rpd->activate_panel;
  233. cgen->apply_button = rpd->apply_button;
  234. cgen->ok_button = rpd->ok_button;
  235. cgen->cancel_button = rpd->cancel_button;
  236. cgen->reset_button = rpd->reset_button;
  237. cgen->help_button = rpd->help_button;
  238. }
  239. else /* AB_PROP_FIXED */
  240. cgen = &dtb_custdlg_prop_dialog;
  241. if (dtb_custdlg_prop_dialog_initialize(cgen, parent) == 0)
  242. {
  243. pcs->prop_sheet = cgen->attrs_ctrlpanel;
  244. pcs->current_obj = NULL;
  245. if (type == AB_PROP_REVOLVING)
  246. XtVaSetValues(parent,
  247. XmNuserData, pcs->current_obj,
  248. NULL);
  249. /* Dialog/Object List */
  250. if (type == AB_PROP_FIXED)
  251. {
  252. prop_fixed_dialog_init(ab_custdlg_palitem,
  253. cgen->prop_dialog_shellform, cgen->objlist);
  254. prop_activate_panel_init(type, ab_custdlg_palitem,
  255. cgen->ok_button, cgen->apply_button,
  256. cgen->reset_button, cgen->cancel_button,
  257. cgen->help_button);
  258. }
  259. /* Alternate Editor Buttons */
  260. prop_editors_panel_init(type, ab_custdlg_palitem,
  261. NULL, cgen->conn_button, cgen->helptxt_button);
  262. /*
  263. * Prop Sheet Settings....
  264. */
  265. /* Name */
  266. prop_field_init(&(pcs->name), cgen->name_field_label,
  267. cgen->name_field, cgen->name_cb);
  268. /* Window Parent */
  269. n = 0;
  270. item[n] = cgen->winparent_opmenu_items.None_item;
  271. item_ptr[n] = (void *) 0; n++;
  272. prop_obj_options_init(&(pcs->win_parent), cgen->winparent_opmenu_label,
  273. cgen->winparent_opmenu, cgen->winparent_opmenu_menu,
  274. n, item, item_ptr,
  275. cgen->winparent_cb, True, /* Display module */
  276. &(pcs->current_obj), winparent_test_func);
  277. /* Title */
  278. prop_field_init(&(pcs->title), cgen->title_field_label, cgen->title_field,
  279. cgen->title_cb);
  280. /* Resize Mode */
  281. n = 0;
  282. item[n] = cgen->resizemode_rbox_items.Adjustable_item;
  283. item_ptr[n] = (void *) True; n++;
  284. item[n] = cgen->resizemode_rbox_items.Fixed_item;
  285. item_ptr[n] = (void *) False; n++;
  286. prop_radiobox_init(&(pcs->resize_mode), cgen->resizemode_rbox_label,
  287. cgen->resizemode_rbox, n, item, item_ptr,
  288. cgen->resizemode_cb);
  289. /* Window Areas */
  290. n = 0;
  291. n = 0;
  292. item[n] = cgen->areas_ckbox_items.Button_Panel_item;
  293. item_val[n] = AB_CONT_BUTTON_PANEL; n++;
  294. item[n] = cgen->areas_ckbox_items.Footer_item;
  295. item_val[n] = AB_CONT_FOOTER; n++;
  296. prop_checkbox_init(&(pcs->areas), cgen->areas_ckbox_label,
  297. cgen->areas_ckbox, n, item, item_val,
  298. cgen->areas_cb);
  299. /* Default Button */
  300. n = 0;
  301. item[n] = cgen->defaultb_opmenu_items.None_item;
  302. item_ptr[n] = (void *) 0; n++;
  303. prop_obj_options_init(&(pcs->default_but), cgen->defaultb_opmenu_label,
  304. cgen->defaultb_opmenu, cgen->defaultb_opmenu_menu,
  305. n, item, item_ptr,
  306. cgen->default_button_cb, False, /* don't display module */
  307. &(pcs->current_obj), button_test_func);
  308. /* Help Button */
  309. n = 0;
  310. item[n] = cgen->helpb_opmenu_items.None_item;
  311. item_ptr[n] = (void *) 0; n++;
  312. prop_obj_options_init(&(pcs->help_but), cgen->helpb_opmenu_label,
  313. cgen->helpb_opmenu, cgen->helpb_opmenu_menu,
  314. n, item, item_ptr,
  315. cgen->help_button_cb, False, /* don't display module */
  316. &(pcs->current_obj), button_test_func);
  317. /* Size Policy */
  318. n = 0;
  319. item[n] = cgen->size_policy_rbox_items.Fit_Contents_item;
  320. item_ptr[n] = (void *) SIZE_OF_CONTENTS_KEY; n++;
  321. item[n] = cgen->size_policy_rbox_items.Fixed_item;
  322. item_ptr[n] = (void *) SIZE_FIXED_KEY; n++;
  323. prop_radiobox_init(&(pcs->size_policy), cgen->size_policy_rbox_label,
  324. cgen->size_policy_rbox, n, item, item_ptr,
  325. cgen->size_policy_cb);
  326. for(i=0; i < n; i++)
  327. XtAddCallback(item[i], XmNvalueChangedCallback,
  328. (XtCallbackProc)prop_size_policyCB, (XtPointer)&(pcs->geometry));
  329. /* Geometry */
  330. prop_geomfield_init(&(pcs->geometry), cgen->geom_label,
  331. NULL, NULL, NULL, NULL,
  332. cgen->width_field_label, cgen->width_field,
  333. cgen->height_field_label, cgen->height_field,
  334. cgen->geom_cb);
  335. /* Initial State */
  336. n = 0;
  337. item[n] = cgen->istate_ckbox_items.Visible_item;
  338. item_val[n] = AB_STATE_VISIBLE; n++;
  339. prop_checkbox_init(&(pcs->init_state), cgen->istate_ckbox_label,
  340. cgen->istate_ckbox, n, item, item_val,
  341. cgen->istate_cb);
  342. /* Color */
  343. prop_colorfield_init(&(pcs->bg_color), cgen->bg_mbutton,
  344. cgen->bg_mbutton_bg_mbutton_menu_items.None_item,
  345. cgen->bg_mbutton_bg_mbutton_menu_items.Color_Chooser_item,
  346. cgen->bg_swatch, cgen->bg_field, cgen->bg_cb);
  347. prop_colorfield_init(&(pcs->fg_color), cgen->fg_mbutton,
  348. cgen->fg_mbutton_fg_mbutton_menu_items.None_item,
  349. cgen->fg_mbutton_fg_mbutton_menu_items.Color_Chooser_item,
  350. cgen->fg_swatch, cgen->fg_field, cgen->fg_cb);
  351. prop_changebars_cleared(pcs->prop_sheet);
  352. return (cgen->prop_dialog_shellform);
  353. }
  354. else
  355. return NULL;
  356. }
  357. static int
  358. custdlg_prop_activate(
  359. AB_PROP_TYPE type,
  360. BOOL active
  361. )
  362. {
  363. ui_set_active(prop_custdlg_settings_rec[type].prop_sheet, active);
  364. return OK;
  365. }
  366. static int
  367. custdlg_prop_clear(
  368. AB_PROP_TYPE type
  369. )
  370. {
  371. PropCustdlgSettingsRec *pcs = &(prop_custdlg_settings_rec[type]);
  372. if (pcs->current_obj == NULL)
  373. return OK;
  374. /* Clear Name */
  375. prop_field_set_value(&(pcs->name), "", False);
  376. /* Clear Window Parent */
  377. prop_obj_options_load(&(pcs->win_parent), NULL);
  378. /* Clear Title */
  379. prop_field_set_value(&(pcs->title), "", False);
  380. /* Clear Resize Mode */
  381. prop_radiobox_set_value(&(pcs->resize_mode), (XtPointer)True, False);
  382. /* Clear Window Areas */
  383. prop_checkbox_set_value(&(pcs->areas), AB_CONT_BUTTON_PANEL, False, False);
  384. prop_checkbox_set_value(&(pcs->areas), AB_CONT_FOOTER, False, False);
  385. /* Clear Default Button */
  386. prop_obj_options_load(&(pcs->default_but), NULL);
  387. /* Clear Help Button */
  388. prop_obj_options_load(&(pcs->help_but), NULL);
  389. /* Clear Size Policy */
  390. prop_radiobox_set_value(&(pcs->size_policy), (XtPointer)SIZE_FIXED_KEY, False);
  391. /* Clear Size */
  392. prop_geomfield_clear(&(pcs->geometry), GEOM_WIDTH);
  393. prop_geomfield_clear(&(pcs->geometry), GEOM_HEIGHT);
  394. /* Clear Initial State */
  395. prop_checkbox_set_value(&(pcs->init_state), AB_STATE_VISIBLE, True, False);
  396. /* Clear Color */
  397. prop_colorfield_set_value(&(pcs->bg_color), "", False);
  398. prop_colorfield_set_value(&(pcs->fg_color), "", False);
  399. pcs->current_obj = NULL;
  400. turnoff_changebars(type);
  401. return OK;
  402. }
  403. static int
  404. custdlg_prop_load(
  405. ABObj obj,
  406. AB_PROP_TYPE type,
  407. unsigned long loadkey
  408. )
  409. {
  410. ABObj area;
  411. PropCustdlgSettingsRec *pcs = &(prop_custdlg_settings_rec[type]);
  412. BOOL load_all = (loadkey & LoadAll);
  413. if (obj == NULL)
  414. {
  415. if (pcs->current_obj != NULL)
  416. obj = pcs->current_obj;
  417. else
  418. return ERROR;
  419. }
  420. else if (!obj_is_popup_win(obj))
  421. return ERROR;
  422. else
  423. pcs->current_obj = obj;
  424. /* Load Name */
  425. if (load_all || loadkey & LoadName)
  426. prop_field_set_value(&(pcs->name), obj_get_name(obj), False);
  427. if (load_all)
  428. {
  429. /* Load Window Parent */
  430. prop_obj_options_load(&(pcs->win_parent), proj_get_project());
  431. prop_obj_options_set_value(&(pcs->win_parent),
  432. obj_get_win_parent(obj), False);
  433. /* Load Title */
  434. prop_field_set_value(&(pcs->title), obj_get_label(obj), False);
  435. /* Load Resize Mode */
  436. prop_radiobox_set_value(&(pcs->resize_mode),
  437. (XtPointer)(intptr_t) obj_get_resizable(obj), False);
  438. /* Load Window Areas */
  439. area = objxm_comp_custdlg_get_area(obj, AB_CONT_BUTTON_PANEL);
  440. prop_checkbox_set_value(&(pcs->areas), AB_CONT_BUTTON_PANEL,
  441. area != NULL, False);
  442. area = objxm_comp_custdlg_get_area(obj, AB_CONT_FOOTER);
  443. prop_checkbox_set_value(&(pcs->areas), AB_CONT_FOOTER,
  444. area != NULL, False);
  445. /* Load Default Button */
  446. prop_obj_options_load(&(pcs->default_but),
  447. objxm_comp_custdlg_get_area(obj, AB_CONT_BUTTON_PANEL));
  448. prop_obj_options_set_value(&(pcs->default_but),
  449. obj_get_default_act_button(obj), False);
  450. /* Load Help Button */
  451. prop_obj_options_load(&(pcs->help_but),
  452. objxm_comp_custdlg_get_area(obj, AB_CONT_BUTTON_PANEL));
  453. prop_obj_options_set_value(&(pcs->help_but),
  454. obj_get_help_act_button(obj), False);
  455. /* Load Size Policy */
  456. prop_radiobox_set_value(&(pcs->size_policy),
  457. abobj_width_resizable(obj)?
  458. (XtPointer)SIZE_FIXED_KEY :
  459. (XtPointer)SIZE_OF_CONTENTS_KEY, False);
  460. /* Load Initial State */
  461. prop_checkbox_set_value(&(pcs->init_state), AB_STATE_VISIBLE,
  462. obj_is_initially_visible(obj), False);
  463. /* Load Color */
  464. prop_colorfield_set_value(&(pcs->bg_color), obj_get_bg_color(obj), False);
  465. prop_colorfield_set_value(&(pcs->fg_color), obj_get_fg_color(obj), False);
  466. turnoff_changebars(type);
  467. }
  468. /* Load Size */
  469. if (load_all || loadkey & LoadSize)
  470. prop_load_obj_size(obj, &(pcs->geometry));
  471. return OK;
  472. }
  473. int
  474. custdlg_prop_apply(
  475. AB_PROP_TYPE type
  476. )
  477. {
  478. PropCustdlgSettingsRec *pcs = &(prop_custdlg_settings_rec[type]);
  479. ABObj module;
  480. ABObj area;
  481. STRING value;
  482. BOOL area_set;
  483. BOOL reset_bg = False;
  484. BOOL reset_fg = False;
  485. BOOL size_chg = False;
  486. int new_w, new_h;
  487. if (!verify_props(type))
  488. return ERROR;
  489. if (prop_changed(pcs->name.changebar))
  490. {
  491. value = prop_field_get_value(&(pcs->name));
  492. abobj_set_name(pcs->current_obj, value);
  493. util_free(value);
  494. }
  495. if (prop_changed(pcs->win_parent.options.changebar))
  496. {
  497. ABObj win_parent = (ABObj) NULL;
  498. win_parent = prop_obj_options_get_value(&(pcs->win_parent));
  499. abobj_set_win_parent(pcs->current_obj, win_parent);
  500. }
  501. if (prop_changed(pcs->title.changebar))
  502. {
  503. value = prop_field_get_value(&(pcs->title));
  504. abobj_set_label(pcs->current_obj, pcs->current_obj->label_type, value);
  505. util_free(value);
  506. }
  507. if (prop_changed(pcs->resize_mode.changebar))
  508. {
  509. abobj_set_resize_mode(pcs->current_obj,
  510. (BOOL)prop_radiobox_get_value(&(pcs->resize_mode)));
  511. }
  512. if (prop_changed(pcs->areas.changebar))
  513. {
  514. module = obj_get_module(pcs->current_obj);
  515. /* Button Panel */
  516. area = objxm_comp_custdlg_get_area(pcs->current_obj, AB_CONT_BUTTON_PANEL);
  517. area_set = prop_checkbox_get_value(&(pcs->areas), AB_CONT_BUTTON_PANEL);
  518. if (area != NULL && !area_set) /* Remove Button Panel */
  519. custdlg_remove_area(pcs->current_obj, area);
  520. else if (area == NULL && area_set) /* Add Button Panel */
  521. custdlg_create_area(pcs->current_obj, AB_CONT_BUTTON_PANEL);
  522. /* Footer */
  523. area = objxm_comp_custdlg_get_area(pcs->current_obj, AB_CONT_FOOTER);
  524. area_set = prop_checkbox_get_value(&(pcs->areas), AB_CONT_FOOTER);
  525. if (area != NULL && !area_set) /* Remove Footer */
  526. custdlg_remove_area(pcs->current_obj, area);
  527. else if (area == NULL && area_set) /* Add Footer */
  528. custdlg_create_area(pcs->current_obj, AB_CONT_FOOTER);
  529. }
  530. if (prop_changed(pcs->default_but.options.changebar))
  531. {
  532. abobj_set_default_act_button(pcs->current_obj,
  533. prop_obj_options_get_value(&(pcs->default_but)));
  534. }
  535. if (prop_changed(pcs->help_but.options.changebar))
  536. {
  537. abobj_set_help_act_button(pcs->current_obj,
  538. prop_obj_options_get_value(&(pcs->help_but)));
  539. }
  540. if (prop_changed(pcs->size_policy.changebar))
  541. {
  542. abobj_set_size_policy(pcs->current_obj,
  543. prop_radiobox_get_value(&(pcs->size_policy)) == SIZE_FIXED_KEY);
  544. size_chg = True;
  545. }
  546. if (prop_changed(pcs->geometry.changebar))
  547. {
  548. if (abobj_width_resizable(pcs->current_obj))
  549. {
  550. new_w = prop_geomfield_get_value(&(pcs->geometry), GEOM_WIDTH);
  551. abobj_set_pixel_width(pcs->current_obj, new_w, 0);
  552. }
  553. if (abobj_height_resizable(pcs->current_obj))
  554. {
  555. new_h = prop_geomfield_get_value(&(pcs->geometry), GEOM_HEIGHT);
  556. abobj_set_pixel_height(pcs->current_obj, new_h, 0);
  557. }
  558. }
  559. if (prop_changed(pcs->init_state.changebar))
  560. {
  561. abobj_set_visible(pcs->current_obj,
  562. prop_checkbox_get_value(&(pcs->init_state), AB_STATE_VISIBLE));
  563. }
  564. if (prop_changed(pcs->fg_color.changebar))
  565. {
  566. value = prop_colorfield_get_value(&(pcs->fg_color));
  567. abobj_set_foreground_color(pcs->current_obj, value);
  568. if (util_strempty(value))
  569. reset_fg = True;
  570. util_free(value);
  571. prop_colorfield_set_value(&(pcs->fg_color), obj_get_fg_color(pcs->current_obj), False);
  572. }
  573. if (prop_changed(pcs->bg_color.changebar))
  574. {
  575. value = prop_colorfield_get_value(&(pcs->bg_color));
  576. abobj_set_background_color(pcs->current_obj, value);
  577. if (util_strempty(value))
  578. reset_bg = True;
  579. util_free(value);
  580. prop_colorfield_set_value(&(pcs->bg_color), obj_get_bg_color(pcs->current_obj), False);
  581. }
  582. abobj_tree_instantiate_changes(pcs->current_obj);
  583. if (reset_bg || reset_fg) /* Set back to No Color */
  584. abobj_reset_colors(pcs->current_obj, reset_bg, reset_fg);
  585. turnoff_changebars(type);
  586. return OK;
  587. }
  588. static BOOL
  589. custdlg_prop_pending(
  590. AB_PROP_TYPE type
  591. )
  592. {
  593. return(prop_changebars_pending(prop_custdlg_settings_rec[type].prop_sheet));
  594. }
  595. static BOOL
  596. verify_props(
  597. AB_PROP_TYPE type
  598. )
  599. {
  600. PropCustdlgSettingsRec *pcs = &(prop_custdlg_settings_rec[type]);
  601. ABObj area;
  602. BOOL area_set;
  603. if (prop_changed(pcs->name.changebar) && !prop_name_ok(pcs->current_obj, pcs->name.field))
  604. return False;
  605. if (prop_changed(pcs->areas.changebar))
  606. {
  607. DTB_MODAL_ANSWER answer = DTB_ANSWER_NONE;
  608. ABObj pobj;
  609. /* Check Button Panel */
  610. area = objxm_comp_custdlg_get_area(pcs->current_obj, AB_CONT_BUTTON_PANEL);
  611. area_set = prop_checkbox_get_value(&(pcs->areas), AB_CONT_BUTTON_PANEL);
  612. if (area != NULL && !area_set) /* Remove Menubar */
  613. {
  614. pobj = objxm_comp_get_subobj(area, AB_CFG_PARENT_OBJ);
  615. if (obj_get_num_children(pobj) > 0)
  616. {
  617. /* Popup Modal Message and wait for answer */
  618. dtb_custdlg_remove_bpanel_msg_initialize(
  619. &dtb_custdlg_remove_bpanel_msg);
  620. answer = dtb_show_modal_message(pcs->areas.checkbox,
  621. &dtb_custdlg_remove_bpanel_msg,
  622. NULL, NULL, NULL);
  623. if (answer == DTB_ANSWER_CANCEL)
  624. return False;
  625. }
  626. }
  627. area = objxm_comp_custdlg_get_area(pcs->current_obj, AB_CONT_FOOTER);
  628. area_set = prop_checkbox_get_value(&(pcs->areas), AB_CONT_FOOTER);
  629. if (area != NULL && !area_set) /* Remove Footer */
  630. {
  631. pobj = objxm_comp_get_subobj(area, AB_CFG_PARENT_OBJ);
  632. if (obj_get_num_children(pobj) > 0)
  633. {
  634. /* Popup Modal Message and wait for answer */
  635. dtb_custdlg_remove_footer_msg_initialize(
  636. &dtb_custdlg_remove_footer_msg);
  637. answer = dtb_show_modal_message(pcs->areas.checkbox,
  638. &dtb_custdlg_remove_footer_msg,
  639. NULL, NULL, NULL);
  640. if (answer == DTB_ANSWER_CANCEL)
  641. return False;
  642. }
  643. }
  644. }
  645. if (prop_changed(pcs->geometry.changebar) &&
  646. (!prop_number_ok(pcs->geometry.w_field, (STRING)WFieldStr, 1, SHRT_MAX) ||
  647. !prop_number_ok(pcs->geometry.h_field, (STRING)HFieldStr, 1, SHRT_MAX)))
  648. return False;
  649. if (prop_changed(pcs->fg_color.changebar) && !prop_color_ok(pcs->fg_color.field))
  650. return False;
  651. if (prop_changed(pcs->bg_color.changebar) && !prop_color_ok(pcs->bg_color.field))
  652. return False;
  653. return True;
  654. }
  655. static void
  656. turnoff_changebars(
  657. AB_PROP_TYPE type
  658. )
  659. {
  660. PropCustdlgSettingsRec *pcs = &(prop_custdlg_settings_rec[type]);
  661. prop_set_changebar(pcs->name.changebar, PROP_CB_OFF);
  662. prop_set_changebar(pcs->win_parent.options.changebar,PROP_CB_OFF);
  663. prop_set_changebar(pcs->title.changebar, PROP_CB_OFF);
  664. prop_set_changebar(pcs->resize_mode.changebar, PROP_CB_OFF);
  665. prop_set_changebar(pcs->areas.changebar, PROP_CB_OFF);
  666. prop_set_changebar(pcs->default_but.options.changebar,PROP_CB_OFF);
  667. prop_set_changebar(pcs->help_but.options.changebar, PROP_CB_OFF);
  668. prop_set_changebar(pcs->size_policy.changebar, PROP_CB_OFF);
  669. prop_set_changebar(pcs->geometry.changebar, PROP_CB_OFF);
  670. prop_set_changebar(pcs->init_state.changebar, PROP_CB_OFF);
  671. prop_set_changebar(pcs->bg_color.changebar, PROP_CB_OFF);
  672. prop_set_changebar(pcs->fg_color.changebar, PROP_CB_OFF);
  673. prop_changebars_cleared(pcs->prop_sheet);
  674. }
  675. static void
  676. custdlg_create_area(
  677. ABObj obj,
  678. AB_CONTAINER_TYPE area_type
  679. )
  680. {
  681. ABObj pwobj;
  682. ABObj label, area;
  683. ABObj workobj;
  684. Dimension height;
  685. pwobj = objxm_comp_get_subobj(obj, AB_CFG_WINDOW_PW_OBJ);
  686. workobj = objxm_comp_get_subobj(obj, AB_CFG_PARENT_OBJ);
  687. area = obj_create(AB_TYPE_CONTAINER, pwobj);
  688. obj_set_subtype(area, area_type);
  689. pal_initialize_obj(area);
  690. if (area_type == AB_CONT_FOOTER)
  691. {
  692. label = obj_create(AB_TYPE_LABEL, area);
  693. obj_set_x(label, 1);
  694. obj_set_y(label, 1);
  695. pal_initialize_obj(label);
  696. obj_set_label(label, CATGETS(Dtb_project_catd, 100, 264, "footer message"));
  697. obj_set_label_alignment(label, AB_ALIGN_LEFT);
  698. obj_set_unique_name(label,
  699. ab_ident_from_name_and_label(obj_get_name(obj), "label"));
  700. /*
  701. * Workaround part1: MainWindow bug that causes MainWindow to shrink
  702. * when a MessageWindow area is added
  703. */
  704. XtVaGetValues(objxm_get_widget(workobj),
  705. XmNheight, &height,
  706. NULL);
  707. }
  708. else if (area_type == AB_CONT_BUTTON_PANEL)
  709. custdlg_create_buttons(obj, area);
  710. abobj_show_tree(area, True);
  711. /* Workaround part2 */
  712. if (area_type == AB_CONT_FOOTER)
  713. XtVaSetValues(objxm_get_widget(workobj),
  714. XmNheight, height,
  715. NULL);
  716. abobj_set_save_needed(obj_get_module(obj), True);
  717. }
  718. static void
  719. custdlg_create_buttons(
  720. ABObj obj,
  721. ABObj area
  722. )
  723. {
  724. ABObj bobj;
  725. char *button_names[] = {"button1","button2","button3"};
  726. char *button_labels[3];
  727. int startpos, endpos;
  728. int i;
  729. button_labels[0] = CATGETS(Dtb_project_catd, 100, 265, "Button1");
  730. button_labels[1] = CATGETS(Dtb_project_catd, 100, 266, "Button2");
  731. button_labels[2] = CATGETS(Dtb_project_catd, 100, 267, "Button3");
  732. endpos = 0;
  733. for(i=0; i < XtNumber(button_names); i++)
  734. {
  735. bobj = obj_create(AB_TYPE_BUTTON, area);
  736. obj_set_subtype(bobj, AB_BUT_PUSH);
  737. obj_set_unique_name(bobj,
  738. ab_ident_from_name_and_label(obj_get_name(obj),button_names[i]));
  739. obj_set_label(bobj, button_labels[i]);
  740. obj_set_is_initially_visible(bobj, True);
  741. obj_set_is_initially_active(bobj, True);
  742. startpos = endpos + 10;
  743. obj_set_attachment(bobj, AB_CP_WEST, AB_ATTACH_GRIDLINE, (void*)(intptr_t) startpos, 0);
  744. endpos = startpos + 20;
  745. obj_set_attachment(bobj, AB_CP_EAST, AB_ATTACH_GRIDLINE, (void*)(intptr_t) endpos, 0);
  746. obj_set_attachment(bobj, AB_CP_NORTH, AB_ATTACH_POINT, NULL, 5);
  747. }
  748. }
  749. static void
  750. custdlg_remove_area(
  751. ABObj obj,
  752. ABObj area
  753. )
  754. {
  755. objxm_tree_destroy(area);
  756. abobj_set_save_needed(obj_get_module(obj), True);
  757. }
  758. /*
  759. * Test whether a Button should be a candidate to be the dialog's
  760. * "Default" button or not
  761. */
  762. static BOOL
  763. button_test_func(
  764. ABObj obj
  765. )
  766. {
  767. ABObj parent = obj_get_root(obj_get_parent(obj));
  768. if (obj_is_button(obj))
  769. {
  770. while (obj_is_group(parent))
  771. parent = obj_get_root(obj_get_parent(parent));
  772. if (obj_get_container_type(parent) == AB_CONT_BUTTON_PANEL)
  773. return True;
  774. }
  775. return False;
  776. }
  777. /*
  778. * Test whether an object can be the "Window Parent" of the dialog
  779. */
  780. static BOOL
  781. winparent_test_func(
  782. ABObj obj
  783. )
  784. {
  785. return(obj_is_base_win(obj));
  786. }