source: tags/arb_5.3/PGT/dialog.cxx

Last change on this file was 5725, checked in by westram, 15 years ago
  • removed useless macros:
    • GB_STRDUP (easily taken for GB_strdup)
    • GB_MEMCPY + GB_MEMSET + GB_FREE
    • GB_DELETE (replaced by freeset(xx,NULL))
  • added macros:
    • freeset (= free + assign)
    • freedup (= free + assign strdup'ed)
    • reassign (= free + assign + clear source var)
    • nulldup (=strdup accepting NULL; replacement for GB_strdup in C++ code)
  • use these macros where applicable
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 9.5 KB
Line 
1// Copyright (c) 2004 - 2005 Kai Bader <baderk@in.tum.de>
2//
3// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
4// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
5// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
6// AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
7// AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
8// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
9
10// CVS REVISION TAG  --  $Revision: 5725 $
11
12
13#include "dialog.hxx"
14#include <stdio.h>
15#include <stdlib.h>
16#include <stdarg.h>
17#include <arbdb.h>
18#include <arbdbt.h>
19// #include <X11/ShellP.h>
20
21
22/****************************************************************************
23*  CALLBACK FUNCTION (FROM THE WINDOW CLOSE CALLBACK)
24****************************************************************************/
25void staticWindowCloseCallback(Widget, XtPointer clientData, XtPointer)
26{
27    // GET POINTER OF THE ORIGINAL CALLER
28    MDialog *md= (MDialog *)clientData;
29
30    // CLOSE THE DIALOG
31    md->closeDialog();
32}
33
34
35/****************************************************************************
36*  MDIALOG - CONSTRUCTOR #1
37****************************************************************************/
38MDialog::MDialog(Widget w)
39{
40    // PREDEFINE VARIABLES
41    m_shell= NULL;
42    m_visible= false;
43    m_parent_dialog= NULL;
44    m_parent_widget= w;
45}
46
47
48/****************************************************************************
49*  MDIALOG - CONSTRUCTOR #2
50****************************************************************************/
51MDialog::MDialog(MDialog *parent)
52{
53    // PREDEFINE VARIABLES
54    m_shell= NULL;
55    m_visible= false;
56
57    // FETCH THE POINTER TO THE PARENT DIALOG
58    m_parent_dialog= parent;
59
60    if(m_parent_dialog)
61    {
62        // ADD NEW DIALOG TO THE PARENTS LIST
63        m_parent_dialog->addChild(this);
64
65        // FETCH THE PARENT WIDGET (IF POSSIBLE)
66        m_parent_widget= m_parent_dialog->shellWidget();
67    }
68    else
69        m_parent_widget= NULL;
70}
71
72
73/****************************************************************************
74*  MDIALOG - DESTRUCTOR
75****************************************************************************/
76MDialog::~MDialog()
77{
78    // CLOSE THIS DIALOG AND ALL CHILDREN
79    closeDialog();
80}
81
82
83/****************************************************************************
84*  MDIALOG - CREATEMYWIDGET
85*  CREATES A NEW TOP LEVEL SHELL
86****************************************************************************/
87void MDialog::createShell(const char *name)
88{
89    // CREATE TOP LEVEL APPLICATION SHELL
90    m_shell= XtVaAppCreateShell(NULL, name,
91        applicationShellWidgetClass, XtDisplay(m_parent_widget),
92        XmNdeleteResponse, XmDO_NOTHING, // WINDOW CLOSE SHOULD BE CALLED MANUALLY...
93        NULL);
94
95    // CREATE AN ATOM TO CATCH WM_DELETE_WINDOW
96    Atom atom = XInternAtom(XtDisplay(m_shell), "WM_DELETE_WINDOW", false);
97
98    // ADD THE CALLBACK TO THE SHELL WIDGET
99    XmAddWMProtocolCallback(m_shell, atom, staticWindowCloseCallback, this);
100}
101
102
103/****************************************************************************
104*  MDIALOG - CLOSE / UNMANAGE DIALOG
105****************************************************************************/
106void MDialog::closeDialog()
107{
108    // KILL ALL CHILDREN
109    while(m_children.size())
110    {
111        // for(vector<MDialog*>::iterator i = m_children.begin(); i != m_children.end(); i++)
112        for(vector<MDialog*>::iterator i = m_children.begin(); i != m_children.end(); ++i)
113        {
114            delete *i;
115            m_children.erase(i);
116            break; // NECESSARY, BECAUSE VECTOR ITERATOR MUST NOW BE REBUILT
117        }
118    }
119    m_children.clear();
120
121    // DESTROY OUR SHELL AND ALL OUR WIDGETS
122    if(m_shell != NULL) XtDestroyWidget(m_shell);
123    m_shell= NULL;
124    m_visible= false;
125
126    // FREE ALL STRINGS PREVIOUSLY USED BY THE DIALOG
127    // for(vector<XmString>::iterator s = m_strings.begin(); s != m_strings.end(); s++)
128    for(vector<XmString>::iterator s = m_strings.begin(); s != m_strings.end(); ++s)
129    {
130        // printf("FREEING STRING \"%s\"\n", XmCvtXmStringToCT((XmString)*s)); // DEBUG
131
132        XmStringFree((XmString)*s);
133    }
134    m_strings.clear();
135}
136
137
138/****************************************************************************
139*  MDIALOG - CLOSE / UNMANAGE DIALOG
140****************************************************************************/
141bool MDialog::isVisible()
142{
143    return m_visible;
144}
145
146
147/****************************************************************************
148*  MDIALOG - CREATEMYWIDGET
149*  CREATES A NEW TOP LEVEL SHELL
150****************************************************************************/
151void MDialog::realizeShell()
152{
153    // REALIZE MAIN AND TOPLEVEL WIDGET
154    if(m_shell) XtRealizeWidget(m_shell);
155
156    // DIALOG IS ENABLED (WE HAVE WIDGETS)
157    m_visible= true;
158
159    // SHOULD RETURN ERROR IF M_SHELL IS UNDEFINED!
160}
161
162
163/****************************************************************************
164*  MDIALOG - SETS THE WINDOW TITLE OF THE DIALOG
165****************************************************************************/
166void MDialog::setDialogTitle(const char *name)
167{
168    if(m_shell)
169        XStoreName(XtDisplay(m_shell), XtWindow(m_shell), const_cast<char*>(name));
170}
171
172
173/****************************************************************************
174*  MDIALOG - SETS THE WINDOW WIDTH AND HEIGHT (IN PIXEL)
175****************************************************************************/
176void MDialog::setDialogSize(int w, int h)
177{
178    if(m_shell)
179        XtVaSetValues(m_shell, XmNwidth, w, XmNheight, h, NULL);
180}
181
182
183/****************************************************************************
184*  MDIALOG - RETURN SHELL WIDGET
185****************************************************************************/
186Widget MDialog::shellWidget()
187{
188    return m_shell;
189}
190
191
192/****************************************************************************
193*  MDIALOG - SHOW WIDGET
194****************************************************************************/
195void MDialog::show()
196{
197    // RARELY TESTED!
198    if(m_shell)
199    {
200        XtMapWidget(m_shell);
201        m_visible= true;
202    }
203
204//    ShellWidget shell_widget= NULL;
205//
206//    if(m_shell != NULL && XtIsSubclass(m_shell, shellWidgetClass))
207//    {
208//       shell_widget= (ShellWidget)m_shell;
209//
210//       if(XtParent(shell_widget) == NULL ||
211//         (XtIsTopLevelShell(shell_widget) &&
212//         XtIsManaged((Widget)shell_widget)) ||
213//         shell_widget->shell.popped_up)
214//       {
215//          XtMapWidget (m_shell);
216//       }
217//    }
218}
219
220
221/****************************************************************************
222*  MDIALOG - HIDE WIDGET
223****************************************************************************/
224void MDialog::hide()
225{
226    // RARELY TESTED!
227    if(m_shell)
228    {
229        XtUnmapWidget(m_shell);
230        m_visible= false;
231    }
232
233//    ShellWidget shell_widget= NULL;
234//
235//    if(m_shell != NULL && XtIsSubclass(m_shell, shellWidgetClass))
236//    {
237//       shell_widget= (ShellWidget)m_shell;
238//
239//       if(XtIsTopLevelShell(shell_widget) ||
240//         shell_widget->shell.popped_up)
241//         {
242// #ifdef USE_WITHDRAW_WINDOW
243//             XWithdrawWindow(XtDisplay(m_shell),
244//                 XtWindow(m_shell),
245//                 XScreenNumberOfScreen(XtScreen(m_shell)));
246// #else
247//             XtUnmapWidget(m_shell);
248// #endif
249//         }
250//     }
251}
252
253
254/****************************************************************************
255*  MDIALOG - ADD A CHILD WIDGET TO THE PARENTS LIST
256****************************************************************************/
257void MDialog::addChild(MDialog *child)
258{
259    // ADD AN ERROR CHECK
260    m_children.push_back(child);
261
262    // SHOULD RETURN THE ADDED CHILD!?
263}
264
265
266/****************************************************************************
267*  MDIALOG - REMOVE A CHILD WIDGET FROM THE PARENTS LIST
268****************************************************************************/
269void MDialog::removeChild(MDialog *child)
270{
271    for(vector<MDialog*>::iterator i = m_children.begin(); i != m_children.end(); ++i)
272    {
273        if((MDialog*)*i == child) m_children.erase(i);
274        break;
275    }
276
277    // SHOULD RETURN THE REMOVED CHILD!?
278}
279
280
281/****************************************************************************
282*  MDIALOG - CREATE A STRING (DIALOG WILL TAKE CARE OF ALLOC/FREE)
283****************************************************************************/
284XmString MDialog::CreateDlgString(const char *c_str)
285{
286    // CREATE A XMSTRING
287    XmString xm_str= XmStringCreateLocalized(const_cast<char*>(c_str));
288
289    // ADD STRING TO THE DIALOGS STRINGS
290    m_strings.push_back(xm_str);
291
292    // RETURN THE STRING
293    return xm_str;
294
295    // CAUTION: THE XMSTRING WILL BE AUTOMATICALLY
296    // FREED BY THE DIALOG CLASS (IN THE DESTRUCTOR).
297}
298
299
300/****************************************************************************
301*  RETURNS THE REAL PATH OF TO A PGT-PIXMAP
302*  --> THIS IS NOT A MDIALOG MEMBER FUNCTION!
303****************************************************************************/
304static char *pixmapPath(const char *pixmapName)
305{
306    return nulldup(GB_path_in_ARBLIB("pixmaps/pgt", pixmapName));
307}
308
309
310/****************************************************************************
311*  EXTENDED LOAD-PIXMAP FUNCTION
312*  --> THIS IS NOT A MDIALOG MEMBER FUNCTION!
313****************************************************************************/
314Pixmap PGT_LoadPixmap(const char *name, Screen *s, Pixel fg, Pixel bg)
315{
316    char *fullname= pixmapPath(name);
317
318    Pixmap pixmap= XmGetPixmap(s, fullname, fg, bg);
319
320    free(fullname);
321
322    return pixmap;
323}
324
Note: See TracBrowser for help on using the repository browser.