2 * CDE - Common Desktop Environment
4 * Copyright (c) 1993-2012, The Open Group. All rights reserved.
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)
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
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with these librararies and programs; if not, write
20 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21 * Floor, Boston, MA 02110-1301 USA
23 /* $XConsortium: AlternatesListUiItem.C /main/3 1995/11/06 16:03:45 rswiston $ */
27 * RESTRICTED CONFIDENTIAL INFORMATION:
29 * The information in this document is subject to special
30 * restrictions in a confidential disclosure agreement bertween
31 * HP, IBM, Sun, USL, SCO and Univel. Do not distribute this
32 * document outside HP, IBM, Sun, USL, SCO, or Univel wihtout
33 * Sun's specific written approval. This documment and all copies
34 * and derivative works thereof must be returned or destroyed at
37 * Copyright 1993 Sun Microsystems, Inc. All rights reserved.
43 #include <DtMail/options_util.h>
44 #include "options_ui.h"
45 #include <DtMail/PropUi.hh>
46 #include <DtMail/ListUiItem.hh>
47 #include <DtMail/AlternatesListUiItem.hh>
49 extern Boolean props_changed;
50 void handleAlternateSelection(Widget w, XtPointer clientdata, XtPointer calldata);
52 // AlternatesListUiItem::AlternatesListUiItem
53 // AlternatesListUiItem ctor
54 ////////////////////////////////////////////////////////////////////
56 AlternatesListUiItem::AlternatesListUiItem(Widget w,
59 Widget text_entry_widget):ListUiItem(w, source, search_key, NULL)
61 source = source; search_key = search_key;
63 entry_field_widget = text_entry_widget;
70 XmNautomaticSelection, True,
71 XmNselectionPolicy, XmBROWSE_SELECT,
75 XmNbrowseSelectionCallback,
76 (XtCallbackProc)handleAlternateSelection,
80 //---------------------------------------------------------------
81 void handleAlternateSelection(Widget w, XtPointer clientdata, XtPointer calldata)
83 AlternatesListUiItem *item;
84 XmListCallbackStruct *list_info = (XmListCallbackStruct *)calldata;
85 char *selection_string = NULL;
86 DtVirtArray<PropStringPair *> *list_items;
87 clientdata = clientdata;
93 list_items = item->getItemList();
95 if(list_items != NULL)
97 // motif index is 1 based
99 PropStringPair *pair = (*list_items)[list_info->item_position - 1];
103 XtVaSetValues(item->getEntryFieldWidget(),
104 XmNvalue,pair->label,
113 // AlternatesListUiItem::writeFromUiToSource()
114 // Takes values in the UI and puts them into the source DB
115 ///////////////////////////////////////////////////////////////////
116 void AlternatesListUiItem::writeFromUiToSource()
118 Widget w = this->getWidget();
120 DtMail::Session * d_session = theRoamApp.session()->session();
121 DtMail::MailRc * mail_rc = d_session->mailRc(error);
124 if(deleted_items != NULL)
126 num_items = deleted_items->length();
128 for(i = 0; i < num_items; i++)
130 mail_rc->removeAlternate(error,(*deleted_items)[i]);
134 if(list_items != NULL)
136 num_items = list_items->length();
137 for(i = 0; i < num_items; i++)
139 mail_rc->setAlternate(error,(*list_items)[i]->label);
143 if(deleted_items != NULL)
145 delete deleted_items;
146 deleted_items = NULL;
150 // AlternatesListUiItem::writeFromSourceToUi()
151 // Takes values in the UI and puts them into the source DB
152 ///////////////////////////////////////////////////////////////////
153 void AlternatesListUiItem::writeFromSourceToUi()
156 DtMail::Session * d_session = theRoamApp.session()->session();
157 DtMail::MailRc * mail_rc = d_session->mailRc(error);
158 Widget w = this->getWidget();
159 const char *list_str = NULL;
160 DtVirtArray<char *> *char_list = NULL;
161 PropStringPair *new_pair;
162 char *token, *buf = NULL;
164 XmListDeleteAllItems(w);
166 if(deleted_items != NULL)
168 delete deleted_items;
169 deleted_items = NULL;
172 if(list_items != NULL)
178 if ((list_str = mail_rc->getAlternates(error)) == NULL) {
179 list_str = strdup("");
182 if ((buf = (char *) malloc(strlen(list_str) + 1)) == NULL)
184 strcpy(buf, (char *)list_str);
186 if((token = (char *) strtok(buf, " ")))
188 list_items = new DtVirtArray<PropStringPair *>(10);
189 char_list = new DtVirtArray<char *>(10);
191 new_pair = new PropStringPair;
192 new_pair->label = strdup(token);
193 new_pair->value = NULL;
194 list_items->append(new_pair);
196 char_list->append(strdup(token));
198 while(token = (char *)strtok(NULL, " "))
200 new_pair = new PropStringPair;
201 new_pair->label = strdup(token);
202 new_pair->value = NULL;
203 list_items->append(new_pair);
205 char_list->append(strdup(token));
209 options_list_init(w, char_list);
213 free((void *)list_str);
220 ///////////////////////////////////////////////////////////
221 void AlternatesListUiItem::handleAddButtonPress()
223 Widget entry_field = this->getEntryFieldWidget();
224 char *test_str = NULL;
225 PropStringPair *new_pair = NULL;
227 XtVaGetValues(entry_field,
232 if(strlen(test_str) > 1)
234 new_pair = new PropStringPair;
235 int *pos_list, num_pos;
237 new_pair->label = strdup(test_str);
238 new_pair->value = NULL;
240 if(XmListGetSelectedPos(this->getWidget(),
244 if(list_items == NULL)
245 list_items = new DtVirtArray<PropStringPair *>(10);
247 list_items->insert(new_pair,pos_list[0] - 1);
248 XmListAddItem(this->getWidget(),
249 XmStringCreateLocalized(new_pair->label),
252 XmListSelectPos(this->getWidget(),
256 XmListSetPos(this->getWidget(),
261 if(list_items == NULL)
262 list_items = new DtVirtArray<PropStringPair *>(10);
264 list_items->insert(new_pair,0);
266 XmListAddItem(this->getWidget(),
267 XmStringCreateLocalized(new_pair->label),
269 XmListSelectPos(this->getWidget(),
272 XmListSetPos(this->getWidget(),
275 props_changed = TRUE;
278 ///////////////////////////////////////////////////////////
279 void AlternatesListUiItem::handleChangeButtonPress()
281 Widget entry_field = this->getEntryFieldWidget();
282 char *test_str = NULL;
283 PropStringPair *new_pair = NULL;
284 XmString replace_string;
285 int *pos_list, num_pos;
287 // if nothing selected nothing to change...
288 if(XmListGetSelectedPos(this->getWidget(),
292 XtVaGetValues(entry_field,
297 if(strlen(test_str) > 1)
300 new_pair = (*list_items)[pos_list[0] - 1];
302 if(deleted_items == NULL)
304 deleted_items = new DtVirtArray<char *>(10);
307 deleted_items->append(strdup((*list_items)[pos_list[0] -1]->label));
309 free(new_pair->label);
310 new_pair->label = strdup(test_str);
312 replace_string = XmStringCreateLocalized(new_pair->label);
314 XmListReplaceItemsPos(this->getWidget(),
319 XmListSelectPos(this->getWidget(),
323 props_changed = TRUE;
326 ///////////////////////////////////////////////////////////
327 void AlternatesListUiItem::handleDeleteButtonPress()
329 Widget list_widget = this->getWidget();
330 int *p_list, p_count;
332 // get the selected position
333 if(XmListGetSelectedPos(list_widget,
338 if(deleted_items == NULL)
340 deleted_items = new DtVirtArray<char *>(10);
343 deleted_items->append(strdup((*list_items)[p_list[0] -1]->label));
345 // delete the item from our list
346 this->list_items->remove(p_list[0] - 1); // remove only first
348 // delete the item from the widget
349 XmListDeletePos(list_widget, p_list[0]);
351 XtVaSetValues(this->getEntryFieldWidget(),
354 XmListSelectPos(list_widget,
358 props_changed = TRUE;