The R Project SVN R

Rev

Rev 26123 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 26123 Rev 27143
1
/*
1
/*
2
 *  R : A Computer Language for Statistical Data Analysis
2
 *  R : A Computer Language for Statistical Data Analysis
3
 *  Copyright (C) 1995, 1996  Robert Gentleman and Ross Ihaka
3
 *  Copyright (C) 1995, 1996  Robert Gentleman and Ross Ihaka
4
 *  Copyright (C) 1997--2003  Robert Gentleman, Ross Ihaka
4
 *  Copyright (C) 1997--2003  Robert Gentleman, Ross Ihaka
5
 *			      and the R Development Core Team
5
 *			      and the R Development Core Team
6
 *
6
 *
7
 *  This program is free software; you can redistribute it and/or modify
7
 *  This program is free software; you can redistribute it and/or modify
8
 *  it under the terms of the GNU General Public License as published by
8
 *  it under the terms of the GNU General Public License as published by
9
 *  the Free Software Foundation; either version 2 of the License, or
9
 *  the Free Software Foundation; either version 2 of the License, or
10
 *  (at your option) any later version.
10
 *  (at your option) any later version.
11
 *
11
 *
12
 *  This program is distributed in the hope that it will be useful,
12
 *  This program is distributed in the hope that it will be useful,
13
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
 *  GNU General Public License for more details.
15
 *  GNU General Public License for more details.
16
 *
16
 *
17
 *  You should have received a copy of the GNU General Public License
17
 *  You should have received a copy of the GNU General Public License
18
 *  along with this program; if not, write to the Free Software
18
 *  along with this program; if not, write to the Free Software
19
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20
 */
20
 */
21
 
21
 
22
#ifndef __AQUA_DATA_BROWSER__
22
#ifndef __AQUA_DATA_BROWSER__
23
#define __AQUA_DATA_BROWSER__
23
#define __AQUA_DATA_BROWSER__
24
 
24
 
25
 
25
 
26
#ifdef HAVE_CONFIG_H
26
#ifdef HAVE_CONFIG_H
27
#include <config.h>
27
#include <config.h>
28
#endif
28
#endif
29
#include <Defn.h>
29
#include <Defn.h>
30
 
30
 
31
#ifdef HAVE_AQUA
31
#ifdef HAVE_AQUA
32
#define __DEBUGGING__
32
#define __DEBUGGING__
33
 
33
 
34
# include <Carbon/Carbon.h>
34
# include <Carbon/Carbon.h>
35
# include "DataBrowser.h"
35
# include "DataBrowser.h"
36
 
36
 
37
#include <limits.h>
37
#include <limits.h>
38
 
38
 
39
#include <R.h>
39
#include <R.h>
40
#include <R_ext/Boolean.h>
40
#include <R_ext/Boolean.h>
41
#include <R_ext/Rdynload.h>
41
#include <R_ext/Rdynload.h>
42
#include <Rdefines.h>
42
#include <Rdefines.h>
43
#include <Rinternals.h>
43
#include <Rinternals.h>
44
 
44
 
45
#ifndef kDataBrowserListViewAppendColumn
45
#ifndef kDataBrowserListViewAppendColumn
46
#define kDataBrowserListViewAppendColumn ULONG_MAX
46
#define kDataBrowserListViewAppendColumn ULONG_MAX
47
#endif
47
#endif
48
#include "Raqua.h"
48
#include "Raqua.h"
49
 
49
 
50
extern RAquaPrefs CurrentPrefs;
50
extern RAquaPrefs CurrentPrefs;
51
 
51
 
52
static void ConfigureDataBrowser(ControlRef);
52
static void ConfigureDataBrowser(ControlRef);
53
static void CreateDataBrowser(WindowRef, ControlRef*);
53
static void CreateDataBrowser(WindowRef, ControlRef*);
54
static ControlRef GetDataBrowserFromWindow(WindowRef window);
54
static ControlRef GetDataBrowserFromWindow(WindowRef window);
55
static void InstallDataBrowserCallbacks(ControlRef);
55
static void InstallDataBrowserCallbacks(ControlRef);
56
 
56
 
57
static pascal OSStatus MyGetSetItemData(ControlRef browser, 
57
static pascal OSStatus MyGetSetItemData(ControlRef browser, 
58
    DataBrowserItemID itemID, DataBrowserPropertyID property, 
58
    DataBrowserItemID itemID, DataBrowserPropertyID property, 
59
    DataBrowserItemDataRef itemData, Boolean changeValue);
59
    DataBrowserItemDataRef itemData, Boolean changeValue);
60
    
60
    
61
static pascal void MyItemNotification(
61
static pascal void MyItemNotification(
62
	ControlRef browser, 
62
	ControlRef browser, 
63
	DataBrowserItemID itemID, 
63
	DataBrowserItemID itemID, 
64
	DataBrowserItemNotification message);
64
	DataBrowserItemNotification message);
65
pascal OSStatus BrowserEventHandler(EventHandlerCallRef, EventRef, void*);
65
pascal OSStatus BrowserEventHandler(EventHandlerCallRef, EventRef, void*);
66
 
66
 
67
static pascal Boolean MyItemComparison(
67
static pascal Boolean MyItemComparison(
68
	ControlRef browser, DataBrowserItemID itemOneID, 
68
	ControlRef browser, DataBrowserItemID itemOneID, 
69
	DataBrowserItemID itemTwoID, DataBrowserPropertyID sortProperty);
69
	DataBrowserItemID itemTwoID, DataBrowserPropertyID sortProperty);
70
	
70
	
71
	
71
	
72
void OpenDataBrowser(void);
72
void OpenDataBrowser(void);
73
void CloseDataBrowser(void);
73
void CloseDataBrowser(void);
74
void FreeBrowserStuff(void);
74
void FreeBrowserStuff(void);
75
 
75
 
76
Boolean isBrowserOpen = false;
76
Boolean isBrowserOpen = false;
77
WindowRef BrowserWindow = NULL;
77
WindowRef BrowserWindow = NULL;
78
ControlRef WSpaceBrowser = NULL;
78
ControlRef WSpaceBrowser = NULL;
79
Rboolean isEventHandlerOn = FALSE;
79
Rboolean isEventHandlerOn = FALSE;
80
 
80
 
81
#define MaxItems  2500
81
#define MaxItems  2500
82
 
82
 
83
/*
83
/*
84
  How works the workspace browser? Suppose you have 4 objects
84
  How works the workspace browser? Suppose you have 4 objects
85
  in the workspace. The should be prepeared as follows:
85
  in the workspace. The should be prepeared as follows:
86
 
86
 
87
  w vector
87
  w vector
88
  x list of 3 objects
88
  x list of 3 objects
89
  y list of 2 object (d,e)
89
  y list of 2 object (d,e)
90
  z vector
90
  z vector
91
 
91
 
92
  number of 
92
  number of 
93
  total items  1  <-  w
93
  total items  1  <-  w
94
             3+1  <-  x
94
             3+1  <-  x
95
             1+2  <-  y
95
             1+2  <-  y
96
            1  <-  z
96
            1  <-  z
97
            ---------
97
            ---------
98
               9  Totale
98
               9  Totale
99
            
99
            
100
object	ID			subitems	IsRoot	IsContainer
100
object	ID			subitems	IsRoot	IsContainer
101
w		1			0			*
101
w		1			0			*
102
x		2			3			*		*
102
x		2			3			*		*
103
y		3			2			*		*
103
y		3			2			*		*
104
z		4			0			*
104
z		4			0			*
105
 
105
 
106
from x 
106
from x 
107
 
107
 
108
a		5			0
108
a		5			0
109
b		6			0
109
b		6			0
110
c		7			0
110
c		7			0
111
 
111
 
112
from y
112
from y
113
d		8			0					
113
d		8			0					
114
e		9			0
114
e		9			0
115
 
115
 
116
 
116
 
117
*/
117
*/
118
 
118
 
119
int		NumOfRoots = 0;
119
UInt32		NumOfRoots = 0;
120
int		*RootItems = NULL; 
120
DataBrowserItemID	*RootItems = NULL; 
121
int		**SubItemsID;
121
int		**SubItemsID;
122
int		CurrentID = 0;
122
int		CurrentID = 0;
123
void	InitContainers(void);
123
void	InitContainers(void);
124
void	SetSubItems(int i);
124
void	SetSubItems(int i);
125
 
125
 
126
Rect WSBounds = { 400, 400, 600, 800 };
126
Rect WSBounds = { 400, 400, 600, 800 };
127
 
127
 
128
/*
128
/*
129
  id : integer, id number in the browser
129
  id : integer, id number in the browser
130
  isroot : boolean, this id is a root item
130
  isroot : boolean, this id is a root item
131
  iscont : boolean, is container?
131
  iscont : boolean, is container?
132
  numofit : integer, number of items
132
  numofit : integer, number of items
133
  parid   : parent id number
133
  parid   : parent id number
134
  name   : char, name of objects
134
  name   : char, name of objects
135
  type   : type, class or mode
135
  type   : type, class or mode
136
  objsize: can be dim, length or number of levels 
136
  objsize: can be dim, length or number of levels 
137
*/
137
*/
138
 
138
 
139
/* The following are local copies of the above */
139
/* The following are local copies of the above */
140
 
140
 
141
int *IDNum;              /* id          */
141
int *IDNum;              /* id          */
142
Rboolean *IsRoot;        /* isroot      */
142
Rboolean *IsRoot;        /* isroot      */
143
Rboolean *IsContainer;   /* iscontainer */
143
Rboolean *IsContainer;   /* iscontainer */
144
int *NumberOfItems;      /* numofit     */
144
UInt32 *NumberOfItems;      /* numofit     */
145
int *ParentID;           /* parid       */
145
int *ParentID;           /* parid       */
146
char **Names;            /* name        */
146
char **Names;            /* name        */
147
char **Types;            /* type        */
147
char **Types;            /* type        */
148
char **Sizes;            /* objsize     */
148
char **Sizes;            /* objsize     */
149
int NumOfID = 0;         /* length of the vectors    */
149
int NumOfID = 0;         /* length of the vectors    */
150
                                /* We do not check for this */ 
150
                                /* We do not check for this */ 
151
 
151
 
152
SEXP Raqua_do_wsbrowser(SEXP call, SEXP op, SEXP args, SEXP env);
152
SEXP Raqua_do_wsbrowser(SEXP call, SEXP op, SEXP args, SEXP env);
153
void EmptyDataBrowser(void);
153
void EmptyDataBrowser(void);
154
 
154
 
155
SEXP Raqua_do_wsbrowser(SEXP call, SEXP op, SEXP args, SEXP env)
155
SEXP Raqua_do_wsbrowser(SEXP call, SEXP op, SEXP args, SEXP env)
156
{
156
{
157
  int i;
157
  int i;
158
   SEXP id, isroot, iscont, numofit, parid;
158
   SEXP id, isroot, iscont, numofit, parid;
159
  SEXP name, type, objsize;
159
  SEXP name, type, objsize;
160
  char *vm;
160
  char *vm;
161
   
161
   
162
  if(isBrowserOpen){
162
  if(isBrowserOpen){
163
    EmptyDataBrowser();
163
    EmptyDataBrowser();
164
   }
164
   }
165
 
165
 
166
  FreeBrowserStuff();
166
  FreeBrowserStuff();
167
    
167
    
168
  checkArity(op, args);
168
  checkArity(op, args);
169
 
169
 
170
  vm = vmaxget();
170
  vm = vmaxget();
171
  id = CAR(args); args = CDR(args);
171
  id = CAR(args); args = CDR(args);
172
  isroot = CAR(args); args = CDR(args);
172
  isroot = CAR(args); args = CDR(args);
173
  iscont = CAR(args); args = CDR(args);
173
  iscont = CAR(args); args = CDR(args);
174
  numofit = CAR(args); args = CDR(args);
174
  numofit = CAR(args); args = CDR(args);
175
  parid = CAR(args); args = CDR(args);
175
  parid = CAR(args); args = CDR(args);
176
  name = CAR(args); args = CDR(args);
176
  name = CAR(args); args = CDR(args);
177
  type = CAR(args); args = CDR(args);
177
  type = CAR(args); args = CDR(args);
178
  objsize = CAR(args); 
178
  objsize = CAR(args); 
179
 
179
 
180
  if(!isInteger(id)) {
180
  if(!isInteger(id)) {
181
   CloseDataBrowser();
181
   CloseDataBrowser();
182
   errorcall(call,"`id' must be integer");
182
   errorcall(call,"`id' must be integer");
183
   }
183
   }
184
   
184
   
185
  NumOfID = LENGTH(id);
185
  NumOfID = LENGTH(id);
186
  if(NumOfID > MaxItems)
186
  if(NumOfID > MaxItems)
187
   NumOfID = MaxItems;
187
   NumOfID = MaxItems;
188
 
188
 
189
   
189
   
190
  if(!isString(name)){
190
  if(!isString(name)){
191
    CloseDataBrowser();
191
    CloseDataBrowser();
192
	errorcall(call, "invalid objects' name");
192
	errorcall(call, "invalid objects' name");
193
  }
193
  }
194
    
194
    
195
  if(!isString(type)){
195
  if(!isString(type)){
196
    CloseDataBrowser();
196
    CloseDataBrowser();
197
    errorcall(call, "invalid objects' type");
197
    errorcall(call, "invalid objects' type");
198
   }
198
   }
199
   
199
   
200
  if(!isString(objsize)){
200
  if(!isString(objsize)){
201
    CloseDataBrowser();
201
    CloseDataBrowser();
202
	errorcall(call, "invalid objects' size");
202
	errorcall(call, "invalid objects' size");
203
  } 
203
  } 
204
  if(!isLogical(isroot)){
204
  if(!isLogical(isroot)){
205
   CloseDataBrowser();
205
   CloseDataBrowser();
206
   errorcall(call, "invalid `isroot' definition");
206
   errorcall(call, "invalid `isroot' definition");
207
  }
207
  }
208
  
208
  
209
  if(!isLogical(iscont)){
209
  if(!isLogical(iscont)){
210
    CloseDataBrowser();
210
    CloseDataBrowser();
211
	errorcall(call, "invalid `iscont' definition");
211
	errorcall(call, "invalid `iscont' definition");
212
  } 
212
  } 
213
  
213
  
214
  if(!isInteger(numofit)){
214
  if(!isInteger(numofit)){
215
   CloseDataBrowser(); 
215
   CloseDataBrowser(); 
216
   errorcall(call,"`numofit' must be integer");
216
   errorcall(call,"`numofit' must be integer");
217
  }
217
  }
218
   
218
   
219
  if(!isInteger(parid)){
219
  if(!isInteger(parid)){
220
   CloseDataBrowser(); 
220
   CloseDataBrowser(); 
221
   errorcall(call,"`parid' must be integer");
221
   errorcall(call,"`parid' must be integer");
222
  }
222
  }
223
  
223
  
224
   
224
   
225
  Names = (char**)malloc(NumOfID * sizeof(char*));
225
  Names = (char**)malloc(NumOfID * sizeof(char*));
226
  Sizes = (char**)malloc(NumOfID * sizeof(char*));
226
  Sizes = (char**)malloc(NumOfID * sizeof(char*));
227
  Types = (char**)malloc(NumOfID * sizeof(char*));
227
  Types = (char**)malloc(NumOfID * sizeof(char*));
228
 
228
 
229
  IDNum = (int*)malloc(NumOfID * sizeof(int));
229
  IDNum = (int*)malloc(NumOfID * sizeof(int));
230
  IsRoot = (Rboolean*)malloc(NumOfID * sizeof(Rboolean));
230
  IsRoot = (Rboolean*)malloc(NumOfID * sizeof(Rboolean));
231
  IsContainer = (Rboolean*)malloc(NumOfID * sizeof(Rboolean));
231
  IsContainer = (Rboolean *)malloc(NumOfID * sizeof(Rboolean));
232
  NumberOfItems = (int*)malloc(NumOfID * sizeof(int));
232
  NumberOfItems = (UInt32 *)malloc(NumOfID * sizeof(UInt32));
233
  ParentID = (int*)malloc(NumOfID * sizeof(int));
233
  ParentID = (int*)malloc(NumOfID * sizeof(int));
234
   
234
   
235
  for(i=0; i<NumOfID; i++){
235
  for(i=0; i<NumOfID; i++){
236
 
236
 
237
   if (!isNull(STRING_ELT(name, i)))
237
   if (!isNull(STRING_ELT(name, i)))
238
	    Names[i] = CHAR(STRING_ELT(name, i));
238
	    Names[i] = CHAR(STRING_ELT(name, i));
239
	else
239
	else
240
	    Names[i] = CHAR(R_BlankString);
240
	    Names[i] = CHAR(R_BlankString);
241
 
241
 
242
   if (!isNull(STRING_ELT(type, i)))
242
   if (!isNull(STRING_ELT(type, i)))
243
	    Types[i] = CHAR(STRING_ELT(type, i));
243
	    Types[i] = CHAR(STRING_ELT(type, i));
244
	else
244
	else
245
	    Types[i] = CHAR(R_BlankString);
245
	    Types[i] = CHAR(R_BlankString);
246
 
246
 
247
   if (!isNull(STRING_ELT(objsize, i)))
247
   if (!isNull(STRING_ELT(objsize, i)))
248
	    Sizes[i] = CHAR(STRING_ELT(objsize, i));
248
	    Sizes[i] = CHAR(STRING_ELT(objsize, i));
249
	else
249
	else
250
	    Sizes[i] = CHAR(R_BlankString);  
250
	    Sizes[i] = CHAR(R_BlankString);  
251
 
251
 
252
	IDNum[i] = INTEGER(id)[i];
252
    IDNum[i] = INTEGER(id)[i];
253
    NumberOfItems[i] = INTEGER(numofit)[i];
253
    NumberOfItems[i] = INTEGER(numofit)[i];
-
 
254
    if(INTEGER(parid)[i] == -1)
-
 
255
     ParentID[i] = kDataBrowserNoItem;
-
 
256
    else 
254
    ParentID[i] = INTEGER(parid)[i]; 
257
    ParentID[i] = INTEGER(parid)[i]; 
255
    IsRoot[i] = LOGICAL(isroot)[i];
258
    IsRoot[i] = LOGICAL(isroot)[i];
256
    IsContainer[i] = LOGICAL(iscont)[i];
259
    IsContainer[i] = LOGICAL(iscont)[i];
-
 
260
   
257
  }
261
  }
258
 
262
 
259
  OpenDataBrowser();
263
  OpenDataBrowser();
260
 
264
 
261
  vmaxset(vm);
265
  vmaxset(vm);
262
  return R_NilValue;
266
  return R_NilValue;
263
}
267
}
264
 
268
 
265
 
269
 
266
 
270
 
267
void InitContainers(void){
271
void InitContainers(void){
268
 
272
 
269
	int i, j, k=0, l;
273
	int i, j, k=0, l;
270
	NumOfRoots = 0;
274
	NumOfRoots = 0;
271
	
275
	
272
	for(i=0;i<NumOfID; i++)
276
	for(i=0;i<NumOfID; i++)
273
	 if(IsRoot[i])
277
	 if(IsRoot[i])
274
	  NumOfRoots++;
278
	  NumOfRoots++;
275
	if(RootItems) free(RootItems);
279
	if(RootItems) free(RootItems);
276
	  
280
	  
277
	RootItems = malloc(sizeof(int)*NumOfRoots);
281
	RootItems = malloc(sizeof(DataBrowserItemID)*NumOfRoots);
278
	SubItemsID = malloc(NumOfID * sizeof(int*));
282
	SubItemsID = malloc(NumOfID * sizeof(int*));
279
 
283
 
280
	for(i = 0; i < NumOfID; i++){
284
	for(i = 0; i < NumOfID; i++){
281
     if(IsRoot[i]) { RootItems[k] = IDNum[i]; k++;}     
285
     if(IsRoot[i]) { RootItems[k] = IDNum[i]; k++;}     
282
     if(IsContainer[i]){
286
     if(IsContainer[i]){
283
      l = 0;
287
      l = 0;
284
      SubItemsID[i] = malloc(sizeof(int)*NumberOfItems[i]);
288
      SubItemsID[i] = malloc(sizeof(int)*NumberOfItems[i]);
285
      for(j=0; j<NumOfID; j++){
289
      for(j=0; j<NumOfID; j++){
286
        if(ParentID[j] == IDNum[i]){
290
        if(ParentID[j] == IDNum[i]){
287
          SubItemsID[i][l] = IDNum[j];
291
          SubItemsID[i][l] = IDNum[j];
288
          l++;
292
          l++;
289
         }
293
         }
290
       }
294
       }
291
     }   /* if(IsContainer[i]) */
295
     } else {   /* if(IsContainer[i]) */
-
 
296
      SubItemsID[i] = malloc(sizeof(int));
-
 
297
      SubItemsID[i][0] = 0;
-
 
298
     }
292
	} /* for */
299
	} /* for */
293
 
300
 
294
}
301
}
295
 
302
 
296
 
303
 
297
 
304
 
298
 
305
 
299
void OpenDataBrowser(void)
306
void OpenDataBrowser(void)
300
{
307
{
301
	OSStatus err = noErr;
308
	OSStatus err = noErr;
302
	int i;
309
	int i;
303
        Rect bounds; 
310
        Rect bounds; 
304
    EventTypeSpec windowEvents[] = {
311
    EventTypeSpec windowEvents[] = {
305
		{ kEventClassCommand,	kEventCommandProcess }, 
312
		{ kEventClassCommand,	kEventCommandProcess }, 
306
		{ kEventClassCommand,	kEventCommandUpdateStatus }, 
313
		{ kEventClassCommand,	kEventCommandUpdateStatus }, 
307
		{ kEventClassWindow,	kEventWindowClose }, 
314
		{ kEventClassWindow,	kEventWindowClose }, 
308
		{ kEventClassWindow,	kEventWindowGetIdealSize },
315
		{ kEventClassWindow,	kEventWindowGetIdealSize },
309
		{ kEventClassWindow,	kEventWindowBoundsChanged }, 
316
		{ kEventClassWindow,	kEventWindowBoundsChanged }, 
310
		{ kEventClassWindow,	kEventWindowGetClickActivation }
317
		{ kEventClassWindow,	kEventWindowGetClickActivation }
311
			};
318
			};
312
    
319
    
313
     
320
     
314
      
321
      
315
   
322
   
316
    InitContainers();
323
    InitContainers();
317
 
324
 
318
 
325
 
319
    if(BrowserWindow == NULL) 
326
    if(BrowserWindow == NULL) 
320
    CreateNewWindow(kDocumentWindowClass,  kWindowStandardHandlerAttribute |
327
    CreateNewWindow(kDocumentWindowClass,  kWindowStandardHandlerAttribute |
321
            kWindowStandardDocumentAttributes, &WSBounds, &BrowserWindow);
328
            kWindowStandardDocumentAttributes, &WSBounds, &BrowserWindow);
322
 
329
 
323
    if(BrowserWindow == NULL)
330
    if(BrowserWindow == NULL)
324
     return;
331
     return;
325
     
332
     
326
     	
333
     	
327
    if(!isEventHandlerOn){
334
    if(!isEventHandlerOn){
328
     InstallWindowEventHandler(BrowserWindow, 
335
     InstallWindowEventHandler(BrowserWindow, 
329
    		NewEventHandlerUPP(BrowserEventHandler), 
336
    		NewEventHandlerUPP(BrowserEventHandler), 
330
    		sizeof(windowEvents)/sizeof(EventTypeSpec), windowEvents, NULL, NULL);
337
    		sizeof(windowEvents)/sizeof(EventTypeSpec), windowEvents, NULL, NULL);
331
     isEventHandlerOn = TRUE;
338
     isEventHandlerOn = TRUE;
332
     SetWindowTitleWithCFString(BrowserWindow, CFSTR("R Workspace Browser"));
339
     SetWindowTitleWithCFString(BrowserWindow, CFSTR("R Workspace Browser"));
333
    }
340
    }
334
     
341
     
335
     
342
     
336
    
343
    
337
    /* Create the DataBrowser */
344
    /* Create the DataBrowser */
338
    if(WSpaceBrowser==NULL){
345
    if(WSpaceBrowser==NULL){
339
     CreateDataBrowser(BrowserWindow, &WSpaceBrowser);
346
     CreateDataBrowser(BrowserWindow, &WSpaceBrowser);
340
     InstallDataBrowserCallbacks(WSpaceBrowser);
347
     InstallDataBrowserCallbacks(WSpaceBrowser);
341
 
348
 
342
    /* Configure the DataBrowser */
349
    /* Configure the DataBrowser */
343
	if(!isBrowserOpen)
350
	if(!isBrowserOpen)
344
	 ConfigureDataBrowser(WSpaceBrowser);
351
	 ConfigureDataBrowser(WSpaceBrowser);
345
    err = SetDataBrowserTarget(WSpaceBrowser, 1);
352
    err = SetDataBrowserTarget(WSpaceBrowser, 0);
346
   
353
   
347
    AddDataBrowserItems(WSpaceBrowser, kDataBrowserNoItem, 
354
    AddDataBrowserItems(WSpaceBrowser, kDataBrowserNoItem, 
348
				(UInt32)NumOfRoots, (DataBrowserItemID *)RootItems, kDataBrowserItemNoProperty);
355
				NumOfRoots, RootItems, kDataBrowserItemNoProperty);
349
 
-
 
350
    /* Set the keyboard focus */
356
    /* Set the keyboard focus */
351
	SetKeyboardFocus(BrowserWindow, WSpaceBrowser, kControlDataBrowserPart);
357
	SetKeyboardFocus(BrowserWindow, WSpaceBrowser, kControlDataBrowserPart);
352
	
358
	
353
	/* Store DB as a window property */
359
	/* Store DB as a window property */
354
    SetWindowProperty(BrowserWindow,
360
    SetWindowProperty(BrowserWindow,
355
        kMyCreator, kMyDataBrowser,
361
        kMyCreator, kMyDataBrowser,
356
        sizeof(WSpaceBrowser), &WSpaceBrowser);
362
        sizeof(WSpaceBrowser), &WSpaceBrowser);
357
 
363
 
358
	
364
	
359
    }
365
    }
360
    
366
    
361
	if(WSpaceBrowser == NULL){              
367
	if(WSpaceBrowser == NULL){              
362
	 CloseDataBrowser();	 
368
	 CloseDataBrowser();	 
363
	 return;
369
	 return;
364
	}
370
	}
365
	
371
	
366
 
372
 
367
    ShowWindow(BrowserWindow);
373
    ShowWindow(BrowserWindow);
368
   
374
   
369
    GetPortBounds(GetWindowPort(BrowserWindow), &bounds);
375
    GetPortBounds(GetWindowPort(BrowserWindow), &bounds);
370
    SizeControl(WSpaceBrowser, bounds.right - bounds.left, bounds.bottom - bounds.top);
376
    SizeControl(WSpaceBrowser, bounds.right - bounds.left, bounds.bottom - bounds.top);
371
 
377
 
372
 
378
 
373
    isBrowserOpen = true;
379
    isBrowserOpen = true;
374
}
380
}
375
 
381
 
376
void FreeBrowserStuff(void)
382
void FreeBrowserStuff(void)
377
{    
383
{    
378
    if(SubItemsID) { free(SubItemsID); SubItemsID = NULL; }
384
    if(SubItemsID) { free(SubItemsID); SubItemsID = NULL; }
379
 
385
 
380
    NumOfID = 0;
386
    NumOfID = 0;
381
    
387
    
382
    if(RootItems)
388
    if(RootItems)
383
     { free(RootItems); RootItems = NULL; }
389
     { free(RootItems); RootItems = NULL; }
384
 
390
 
385
    if(Names)   { free(Names); Names = NULL; }
391
    if(Names)   { free(Names); Names = NULL; }
386
    if(Sizes)   { free(Sizes); Sizes = NULL; }
392
    if(Sizes)   { free(Sizes); Sizes = NULL; }
387
    if(Types)   { free(Types); Types = NULL; }
393
    if(Types)   { free(Types); Types = NULL; }
388
    if(IDNum)   { free(IDNum); IDNum = NULL; }
394
    if(IDNum)   { free(IDNum); IDNum = NULL; }
389
    if(IsRoot)  { free(IsRoot); IsRoot = NULL; }
395
    if(IsRoot)  { free(IsRoot); IsRoot = NULL; }
390
    if(IsContainer)  { free(IsContainer); IsContainer = NULL; }
396
    if(IsContainer)  { free(IsContainer); IsContainer = NULL; }
391
    if(NumberOfItems) { free(NumberOfItems); NumberOfItems = NULL; }
397
    if(NumberOfItems) { free(NumberOfItems); NumberOfItems = NULL; }
392
    if(ParentID) { free(ParentID); ParentID = NULL; }
398
    if(ParentID) { free(ParentID); ParentID = NULL; }
393
 
399
 
394
}
400
}
395
 
401
 
396
 
402
 
397
 
403
 
398
void EmptyDataBrowser(void)
404
void EmptyDataBrowser(void)
399
{
405
{
400
  RemoveDataBrowserItems (WSpaceBrowser, kDataBrowserNoItem, 0, 
406
  RemoveDataBrowserItems (WSpaceBrowser, kDataBrowserNoItem, 0, 
401
          NULL, kDataBrowserItemNoProperty);
407
          NULL, kDataBrowserItemNoProperty);
402
} 
408
} 
403
 
409
 
404
void CloseDataBrowser(void)
410
void CloseDataBrowser(void)
405
{
411
{
406
 
412
 
407
    if(BrowserWindow){
413
    if(BrowserWindow){
408
     if( GetWindowBounds(BrowserWindow,kWindowStructureRgn,&WSBounds) != noErr)
414
     if( GetWindowBounds(BrowserWindow,kWindowStructureRgn,&WSBounds) != noErr)
409
      SetRect(&WSBounds, 400, 400, 600, 800);
415
      SetRect(&WSBounds, 400, 400, 600, 800);
410
    }
416
    }
411
    else 
417
    else 
412
     SetRect(&WSBounds, 400, 400, 600, 800);
418
     SetRect(&WSBounds, 400, 400, 600, 800);
413
      
419
      
414
	
420
	
415
    DisposeWindow(BrowserWindow);
421
    DisposeWindow(BrowserWindow);
416
    BrowserWindow = NULL;
422
    BrowserWindow = NULL;
417
    
423
    
418
	isEventHandlerOn = FALSE;
424
	isEventHandlerOn = FALSE;
419
	
425
	
420
    FreeBrowserStuff();
426
    FreeBrowserStuff();
421
          
427
          
422
    isBrowserOpen = false;
428
    isBrowserOpen = false;
423
    WSpaceBrowser = NULL;
429
    WSpaceBrowser = NULL;
424
} 
430
} 
425
 
431
 
426
static void CreateDataBrowser(WindowRef window, ControlRef *browser)
432
static void CreateDataBrowser(WindowRef window, ControlRef *browser)
427
{
433
{
428
    Rect bounds;
434
    Rect bounds;
429
    Boolean frameAndFocus = false;
435
    Boolean frameAndFocus = false;
430
    
436
    
431
    /* Create a DataBrowser */
437
    /* Create a DataBrowser */
432
    GetWindowBounds(window, kWindowContentRgn, &bounds);
438
    GetWindowBounds(window, kWindowContentRgn, &bounds);
433
 
439
 
434
    bounds.top = bounds.left = 0;
440
    bounds.top = bounds.left = 0;
435
    bounds.right = bounds.right - bounds.left;
441
    bounds.right = bounds.right - bounds.left;
436
    bounds.bottom = bounds.bottom - bounds.top;
442
    bounds.bottom = bounds.bottom - bounds.top;
437
    
443
    
438
    CreateDataBrowserControl(window, 
444
    CreateDataBrowserControl(window, 
439
    	&bounds, kDataBrowserListView, browser);
445
    	&bounds, kDataBrowserListView, browser);
440
 
446
 
441
    /* Turn off DB's focus frame */
447
    /* Turn off DB's focus frame */
442
	SetControlData(
448
	SetControlData(
443
		*browser, kControlNoPart, 
449
		*browser, kControlNoPart, 
444
		kControlDataBrowserIncludesFrameAndFocusTag,
450
		kControlDataBrowserIncludesFrameAndFocusTag,
445
		sizeof(frameAndFocus), &frameAndFocus);
451
		sizeof(frameAndFocus), &frameAndFocus);
446
}
452
}
447
 
453
 
448
static void ConfigureDataBrowser(ControlRef browser)
454
static void ConfigureDataBrowser(ControlRef browser)
449
{
455
{
450
	Rect insetRect;
456
	Rect insetRect;
451
	DataBrowserViewStyle viewStyle;
457
	DataBrowserViewStyle viewStyle;
452
        SInt16                            fontID;
458
        SInt16                            fontID;
453
        Str255	fontname;
459
        Str255	fontname;
454
     
460
     
455
	GetDataBrowserViewStyle(browser, &viewStyle);
461
	GetDataBrowserViewStyle(browser, &viewStyle);
456
	
462
	
457
	GetDataBrowserScrollBarInset(browser, &insetRect);
463
	GetDataBrowserScrollBarInset(browser, &insetRect);
458
	
464
	
459
	insetRect.right = 16 - 1;
465
	insetRect.right = 16 - 1;
460
	SetDataBrowserScrollBarInset(browser, &insetRect);
466
	SetDataBrowserScrollBarInset(browser, &insetRect);
461
 
467
 
462
	switch (viewStyle)
468
	switch (viewStyle)
463
	{
469
	{
464
		case kDataBrowserListView:
470
		case kDataBrowserListView:
465
		{	DataBrowserListViewColumnDesc columnDesc;
471
		{	DataBrowserListViewColumnDesc columnDesc;
466
			
472
			
467
			columnDesc.headerBtnDesc.titleOffset = 0;
473
			columnDesc.headerBtnDesc.titleOffset = 0;
468
			
474
			
469
			columnDesc.headerBtnDesc.version = 
475
			columnDesc.headerBtnDesc.version = 
470
				kDataBrowserListViewLatestHeaderDesc;
476
				kDataBrowserListViewLatestHeaderDesc;
471
				
477
				
472
			columnDesc.headerBtnDesc.btnFontStyle.flags	= 
478
			columnDesc.headerBtnDesc.btnFontStyle.flags	= 
473
				kControlUseFontMask | kControlUseJustMask;
479
				kControlUseFontMask | kControlUseJustMask;
474
			
480
			
475
			columnDesc.headerBtnDesc.btnContentInfo.contentType = kControlNoContent;
481
			columnDesc.headerBtnDesc.btnContentInfo.contentType = kControlNoContent;
476
 
482
 
477
 
483
 
478
			/* Add the Object column */
484
			/* Add the Object column */
479
			
485
			
480
			columnDesc.propertyDesc.propertyID = kObjectColumn;
486
			columnDesc.propertyDesc.propertyID = kObjectColumn;
481
			columnDesc.propertyDesc.propertyType = kDataBrowserTextType;
487
			columnDesc.propertyDesc.propertyType = kDataBrowserTextType;
482
			columnDesc.propertyDesc.propertyFlags = kDataBrowserPropertyIsMutable | 
488
			columnDesc.propertyDesc.propertyFlags = kDataBrowserPropertyIsMutable | 
483
			  kDataBrowserListViewDefaultColumnFlags;
489
			  kDataBrowserListViewDefaultColumnFlags;
484
			
490
			
485
		 
491
		 
486
			columnDesc.headerBtnDesc.minimumWidth = 30;
492
			columnDesc.headerBtnDesc.minimumWidth = 30;
487
			columnDesc.headerBtnDesc.maximumWidth = 200;
493
			columnDesc.headerBtnDesc.maximumWidth = 200;
488
			
494
			
489
			columnDesc.headerBtnDesc.btnFontStyle.just = teFlushLeft;
495
			columnDesc.headerBtnDesc.btnFontStyle.just = teFlushLeft;
490
	
496
	
491
                        CopyCStringToPascal(CurrentPrefs.ConsoleFontName, fontname);
497
                        CopyCStringToPascal(CurrentPrefs.ConsoleFontName, fontname);
492
                        GetFNum(fontname,&fontID);
498
                        GetFNum(fontname,&fontID);
493
      
499
      
494
			columnDesc.headerBtnDesc.btnFontStyle.font = fontID;
500
			columnDesc.headerBtnDesc.btnFontStyle.font = fontID;
495
			columnDesc.headerBtnDesc.btnFontStyle.size = CurrentPrefs.ConsoleFontSize;
501
			columnDesc.headerBtnDesc.btnFontStyle.size = CurrentPrefs.ConsoleFontSize;
496
			columnDesc.headerBtnDesc.btnFontStyle.style = normal;
502
			columnDesc.headerBtnDesc.btnFontStyle.style = normal;
497
			columnDesc.headerBtnDesc.btnFontStyle.backColor = CurrentPrefs.BGOutputColor;
503
			columnDesc.headerBtnDesc.btnFontStyle.backColor = CurrentPrefs.BGOutputColor;
498
			
504
			
499
			columnDesc.headerBtnDesc.titleString = CFStringCreateWithCString(
505
			columnDesc.headerBtnDesc.titleString = CFStringCreateWithCString(
500
				CFAllocatorGetDefault(), "Object", kCFStringEncodingMacRoman);
506
				CFAllocatorGetDefault(), "Object", kCFStringEncodingMacRoman);
501
			
507
			
502
			AddDataBrowserListViewColumn(browser, 
508
			AddDataBrowserListViewColumn(browser, 
503
				&columnDesc, kDataBrowserListViewAppendColumn),
509
				&columnDesc, kDataBrowserListViewAppendColumn),
504
			
510
			
505
			/* Add the Type column */
511
			/* Add the Type column */
506
			
512
			
507
			columnDesc.propertyDesc.propertyID = kTypeColumn;
513
			columnDesc.propertyDesc.propertyID = kTypeColumn;
508
			
514
			
509
			columnDesc.headerBtnDesc.btnFontStyle.just = teFlushLeft;
515
			columnDesc.headerBtnDesc.btnFontStyle.just = teFlushLeft;
510
 
516
 
511
			columnDesc.propertyDesc.propertyFlags = kDataBrowserPropertyIsMutable | 
517
			columnDesc.propertyDesc.propertyFlags = kDataBrowserPropertyIsMutable | 
512
													kDataBrowserListViewDefaultColumnFlags;
518
													kDataBrowserListViewDefaultColumnFlags;
513
 
519
 
514
			columnDesc.headerBtnDesc.titleString = CFStringCreateWithCString(
520
			columnDesc.headerBtnDesc.titleString = CFStringCreateWithCString(
515
				CFAllocatorGetDefault(), "Type", kCFStringEncodingMacRoman);
521
				CFAllocatorGetDefault(), "Type", kCFStringEncodingMacRoman);
516
			
522
			
517
			AddDataBrowserListViewColumn(browser, 
523
			AddDataBrowserListViewColumn(browser, 
518
				&columnDesc, kDataBrowserListViewAppendColumn);
524
				&columnDesc, kDataBrowserListViewAppendColumn);
519
			
525
			
520
			/* Add the Properties column */
526
			/* Add the Properties column */
521
			
527
			
522
			columnDesc.propertyDesc.propertyID = kSizeColumn;
528
			columnDesc.propertyDesc.propertyID = kSizeColumn;
523
			columnDesc.propertyDesc.propertyType = kDataBrowserTextType;
529
			columnDesc.propertyDesc.propertyType = kDataBrowserTextType;
524
			columnDesc.propertyDesc.propertyFlags = kDataBrowserPropertyIsMutable | 
530
			columnDesc.propertyDesc.propertyFlags = kDataBrowserPropertyIsMutable | 
525
													kDataBrowserListViewDefaultColumnFlags;
531
													kDataBrowserListViewDefaultColumnFlags;
526
			
532
			
527
		
533
		
528
			columnDesc.headerBtnDesc.minimumWidth = 30;
534
			columnDesc.headerBtnDesc.minimumWidth = 30;
529
			columnDesc.headerBtnDesc.maximumWidth = 200;
535
			columnDesc.headerBtnDesc.maximumWidth = 200;
530
			columnDesc.headerBtnDesc.btnFontStyle.just = teFlushLeft;
536
			columnDesc.headerBtnDesc.btnFontStyle.just = teFlushLeft;
531
			
537
			
532
			columnDesc.headerBtnDesc.titleString =CFStringCreateWithCString(
538
			columnDesc.headerBtnDesc.titleString =CFStringCreateWithCString(
533
				CFAllocatorGetDefault(), "Property", kCFStringEncodingMacRoman);
539
				CFAllocatorGetDefault(), "Property", kCFStringEncodingMacRoman);
534
		
540
		
535
			AddDataBrowserListViewColumn(browser, 
541
			AddDataBrowserListViewColumn(browser, 
536
				&columnDesc, kDataBrowserListViewAppendColumn);
542
				&columnDesc, kDataBrowserListViewAppendColumn);
537
			 
543
			 
538
			SetDataBrowserListViewDisclosureColumn(browser, kObjectColumn, false);
544
			SetDataBrowserListViewDisclosureColumn(browser, kObjectColumn, false);
539
			
545
			
540
		}	break;
546
		}	break;
541
	}
547
	}
542
}
548
}
543
 
549
 
544
 
550
 
545
static ControlRef GetDataBrowserFromWindow(WindowRef window)
551
static ControlRef GetDataBrowserFromWindow(WindowRef window)
546
{
552
{
547
	ControlRef browser = NULL;
553
	ControlRef browser = NULL;
548
	
554
	
549
	if (window != NULL)
555
	if (window != NULL)
550
		GetWindowProperty(window, kMyCreator, 
556
		GetWindowProperty(window, kMyCreator, 
551
		kMyDataBrowser, sizeof(browser), NULL, &browser);
557
		kMyDataBrowser, sizeof(browser), NULL, &browser);
552
	
558
	
553
	return browser;
559
	return browser;
554
}
560
}
555
 
561
 
556
 
562
 
557
void InstallDataBrowserCallbacks(ControlRef browser)
563
void InstallDataBrowserCallbacks(ControlRef browser)
558
{
564
{
559
    DataBrowserCallbacks myCallbacks;
565
    DataBrowserCallbacks myCallbacks;
560
    
566
    
561
 
567
 
562
    myCallbacks.version = kDataBrowserLatestCallbacks;
568
    myCallbacks.version = kDataBrowserLatestCallbacks;
563
    InitDataBrowserCallbacks(&myCallbacks);
569
    InitDataBrowserCallbacks(&myCallbacks);
564
    
570
    
565
    myCallbacks.u.v1.itemDataCallback = 
571
    myCallbacks.u.v1.itemDataCallback = 
566
        NewDataBrowserItemDataUPP(MyGetSetItemData);
572
        NewDataBrowserItemDataUPP(MyGetSetItemData);
567
	
573
	
568
	myCallbacks.u.v1.itemCompareCallback = 
574
	myCallbacks.u.v1.itemCompareCallback = 
569
		NewDataBrowserItemCompareUPP(MyItemComparison);
575
		NewDataBrowserItemCompareUPP(MyItemComparison);
570
 
576
 
571
    myCallbacks.u.v1.itemNotificationCallback = 
577
    myCallbacks.u.v1.itemNotificationCallback = 
572
        NewDataBrowserItemNotificationUPP(MyItemNotification);
578
        NewDataBrowserItemNotificationUPP(MyItemNotification);
573
     
579
     
574
 
580
 
575
    SetDataBrowserCallbacks(browser, &myCallbacks);
581
    SetDataBrowserCallbacks(browser, &myCallbacks);
576
}
582
}
577
 
583
 
578
 
584
 
579
 
585
 
580
static pascal Boolean MyItemComparison(
586
static pascal Boolean MyItemComparison(
581
	ControlRef browser, DataBrowserItemID itemOneID, 
587
	ControlRef browser, DataBrowserItemID itemOneID, 
582
	DataBrowserItemID itemTwoID, DataBrowserPropertyID sortProperty)
588
	DataBrowserItemID itemTwoID, DataBrowserPropertyID sortProperty)
583
{
589
{
584
	SInt16 compareResult = 0;
590
	SInt16 compareResult = 0;
585
	
591
	
586
	#define Compare(i1,i2,p) MyItemComparison(browser,i1,i2,p)
592
	#define Compare(i1,i2,p) MyItemComparison(browser,i1,i2,p)
587
	
593
	
588
	switch (sortProperty)
594
	switch (sortProperty)
589
	{
595
	{
590
		case kObjectColumn:
596
		case kObjectColumn:
591
		{	Str255 s1, s2;
597
		{	Str255 s1, s2;
592
			compareResult = strcmp(Names[itemOneID-1],Names[itemTwoID-1]);
598
			compareResult = strcmp(Names[itemOneID-1],Names[itemTwoID-1]);
593
			if (compareResult < 0) return true;
599
			if (compareResult < 0) return true;
594
			else if (compareResult > 0) return false;
600
			else if (compareResult > 0) return false;
595
			else return Compare(itemOneID, itemTwoID, kDontKnow);
601
			else return Compare(itemOneID, itemTwoID, kDontKnow);
596
		}	break;
602
		}	break;
597
		
603
		
598
		default:
604
		default:
599
		{	return itemOneID < itemTwoID;
605
		{	return itemOneID < itemTwoID;
600
		}	break;
606
		}	break;
601
	}
607
	}
602
}
608
}
603
 
609
 
604
 
610
 
605
 
611
 
606
static pascal OSStatus MyGetSetItemData(ControlRef browser, 
612
static pascal OSStatus MyGetSetItemData(ControlRef browser, 
607
    DataBrowserItemID itemID, DataBrowserPropertyID property, 
613
    DataBrowserItemID itemID, DataBrowserPropertyID property, 
608
    DataBrowserItemDataRef itemData, Boolean changeValue)
614
    DataBrowserItemDataRef itemData, Boolean changeValue)
609
{
615
{
610
#pragma unused (browser)
616
#pragma unused (browser)
611
	Str255 pascalString;
617
	Str255 pascalString;
612
	OSStatus err = noErr;
618
	OSStatus err = noErr;
613
	
619
	
614
	if (!changeValue) 
620
	if (!changeValue) 
615
	 switch (property)
621
	 switch (property)
616
	{
622
	{
617
		
623
		
618
		case kObjectColumn:
624
		case kObjectColumn:
619
		{
625
		{
620
			CFStringRef text;
626
			CFStringRef text;
621
			CopyCStringToPascal(Names[itemID-1],pascalString);
627
                        CopyCStringToPascal(Names[itemID-1],pascalString);
622
			text = CFStringCreateWithPascalString(
628
			text = CFStringCreateWithPascalString(
623
				CFAllocatorGetDefault(), pascalString, kCFStringEncodingMacRoman);
629
				CFAllocatorGetDefault(), pascalString, kCFStringEncodingMacRoman);
624
			err = SetDataBrowserItemDataText(itemData, text); 
630
			err = SetDataBrowserItemDataText(itemData, text); 
625
		CFRelease(text);
631
		CFRelease(text);
626
		}	
632
		}	
627
		break;
633
		break;
628
 
634
 
629
		case kTypeColumn:
635
		case kTypeColumn:
630
		{	CFStringRef text;
636
		{	CFStringRef text;
631
			CopyCStringToPascal(Types[itemID-1],pascalString);
637
			CopyCStringToPascal(Types[itemID-1],pascalString);
632
			 text = CFStringCreateWithPascalString(
638
			 text = CFStringCreateWithPascalString(
633
				CFAllocatorGetDefault(), pascalString, kCFStringEncodingMacRoman);
639
				CFAllocatorGetDefault(), pascalString, kCFStringEncodingMacRoman);
634
			err = SetDataBrowserItemDataText(itemData, text); 
640
			err = SetDataBrowserItemDataText(itemData, text); 
635
			CFRelease(text);
641
			CFRelease(text);
636
		}	
642
		}	
637
		break;
643
		break;
638
				
644
				
639
 
645
 
640
		case kSizeColumn:
646
		case kSizeColumn:
641
		{
647
		{
642
			CFStringRef text=NULL;
648
			CFStringRef text=NULL;
643
				CopyCStringToPascal(Sizes[itemID-1],pascalString);
649
				CopyCStringToPascal(Sizes[itemID-1],pascalString);
644
			text = CFStringCreateWithPascalString(
650
			text = CFStringCreateWithPascalString(
645
				CFAllocatorGetDefault(), pascalString, kCFStringEncodingMacRoman);
651
				CFAllocatorGetDefault(), pascalString, kCFStringEncodingMacRoman);
646
			err = SetDataBrowserItemDataText(itemData, text); 
652
			err = SetDataBrowserItemDataText(itemData, text); 
647
			CFRelease(text);
653
			CFRelease(text);
648
		}	
654
		}	
649
		break;
655
		break;
650
		
656
		
651
 
657
 
652
		
658
		
653
		case kDataBrowserItemIsEditableProperty:
659
		case kDataBrowserItemIsEditableProperty:
654
		{	err = SetDataBrowserItemDataBooleanValue(itemData, false);
660
		{	err = SetDataBrowserItemDataBooleanValue(itemData, false);
655
		}	break;
661
		}	break;
656
		
662
		
657
		case kDataBrowserItemIsContainerProperty:
663
		case kDataBrowserItemIsContainerProperty:
658
		{	err = SetDataBrowserItemDataBooleanValue(itemData, IsContainer[itemID-1]);
664
		{	err = SetDataBrowserItemDataBooleanValue(itemData, IsContainer[itemID-1]);
659
		}	break;
665
		}	break;
660
		
666
		
661
		case kDataBrowserItemParentContainerProperty:
667
		case kDataBrowserItemParentContainerProperty:
662
		{	err = SetDataBrowserItemDataItemID(itemData, ParentID[itemID-1]);
668
		{	err = SetDataBrowserItemDataItemID(itemData, ParentID[itemID-1]);
663
		}	break;
669
		}	break;
664
 
670
 
665
		default:
671
		default:
666
		{	err = errDataBrowserPropertyNotSupported;
672
		{	err = errDataBrowserPropertyNotSupported;
667
		}	break;
673
		}	break;
668
	}
674
	}
669
	else err = errDataBrowserPropertyNotSupported;
675
	else err = errDataBrowserPropertyNotSupported;
670
	
676
	
671
	return err;
677
	return err;
672
}
678
}
673
 
679
 
674
 
680
 
675
 static pascal void MyItemNotification(
681
 static pascal void MyItemNotification(
676
	ControlRef browser, 
682
	ControlRef browser, 
677
	DataBrowserItemID itemID, 
683
	DataBrowserItemID itemID, 
678
	DataBrowserItemNotification message)
684
	DataBrowserItemNotification message)
679
{
685
{
680
	UInt32 i;
686
	UInt32 i;
681
	UInt32 numSelectedItems;
687
	UInt32 numSelectedItems;
682
	UInt16 j;
688
	UInt16 j;
683
	
689
	
684
	switch (message)
690
	switch (message)
685
	{
691
	{
686
		case kDataBrowserItemSelected:
692
		case kDataBrowserItemSelected:
687
		{	Handle handle = NewHandle(0);
693
		{	Handle handle = NewHandle(0);
688
			GetDataBrowserItems(browser, 
694
			GetDataBrowserItems(browser, 
689
				kDataBrowserNoItem, true, kDataBrowserItemIsSelected, handle);
695
				kDataBrowserNoItem, true, kDataBrowserItemIsSelected, handle);
690
		    numSelectedItems = GetHandleSize(handle)/sizeof(DataBrowserItemID);
696
		    numSelectedItems = GetHandleSize(handle)/sizeof(DataBrowserItemID);
691
		}	break;
697
		}	break;
692
		
698
		
693
		case kDataBrowserContainerOpened:
699
		case kDataBrowserContainerOpened:
694
		{	
700
		{	
695
			AddDataBrowserItems(browser, itemID, (UInt32)NumberOfItems[itemID-1], (DataBrowserItemID *)SubItemsID[itemID-1], kObjectColumn);
701
                AddDataBrowserItems(browser, itemID, NumberOfItems[itemID-1], (DataBrowserItemID *)SubItemsID[itemID-1], kObjectColumn);
696
			{	
702
			{	
697
				Boolean variableHeightRows;
703
				Boolean variableHeightRows;
698
				GetDataBrowserTableViewGeometry(
704
				GetDataBrowserTableViewGeometry(
699
					browser, NULL, &variableHeightRows);
705
					browser, NULL, &variableHeightRows);
700
					
706
					
701
				if (variableHeightRows)
707
				if (variableHeightRows)
702
					for ( j = 0; j < NumberOfItems[itemID-1]; j++)
708
					for ( j = 0; j < NumberOfItems[itemID-1]; j++)
703
						SetDataBrowserTableViewItemRowHeight(
709
						SetDataBrowserTableViewItemRowHeight(
704
							browser, SubItemsID[itemID-1][j], 20 + (SubItemsID[itemID-1][j] - 1) % 10 * 3);
710
							browser, SubItemsID[itemID-1][j], 20 + (SubItemsID[itemID-1][j] - 1) % 10 * 3);
705
			}
711
			}
706
		}	
712
		}	
707
		
713
		
708
		break;
714
		break;
709
	}
715
	}
710
}
716
}
711
 
717
 
712
pascal OSStatus BrowserEventHandler(
718
pascal OSStatus BrowserEventHandler(
713
	EventHandlerCallRef a, EventRef inEvent, void*b)
719
	EventHandlerCallRef a, EventRef inEvent, void*b)
714
{
720
{
715
    OSStatus result = noErr;
721
    OSStatus result = noErr;
716
 
722
 
717
	switch (GetEventClass(inEvent))
723
	switch (GetEventClass(inEvent))
718
	{
724
	{
719
    	default:
725
    	default:
720
    	{	result = eventNotHandledErr;
726
    	{	result = eventNotHandledErr;
721
    	}	break;
727
    	}	break;
722
		
728
		
723
 
729
 
724
		
730
		
725
	    case kEventClassWindow:
731
	    case kEventClassWindow:
726
		{
732
		{
727
		    WindowRef window = NULL;
733
		    WindowRef window = NULL;
728
			GetEventParameter(inEvent, 
734
			GetEventParameter(inEvent, 
729
		        kEventParamDirectObject, typeWindowRef, 
735
		        kEventParamDirectObject, typeWindowRef, 
730
		        NULL, sizeof(window), NULL, &window);
736
		        NULL, sizeof(window), NULL, &window);
731
 
737
 
732
		    switch (GetEventKind(inEvent))
738
		    switch (GetEventKind(inEvent))
733
		 	{
739
		 	{
734
		    	default:
740
		    	default:
735
		    	{	result = eventNotHandledErr;
741
		    	{	result = eventNotHandledErr;
736
		    	}	break;
742
		    	}	break;
737
				
743
				
738
				
744
				
739
				 case kEventWindowClose:
745
				 case kEventWindowClose:
740
		     	{
746
		     	{
741
                  	CloseDataBrowser();
747
                  	CloseDataBrowser();
742
			 	}	break;
748
			 	}	break;
743
 
749
 
744
		    	case kEventWindowBoundsChanged:
750
		    	case kEventWindowBoundsChanged:
745
		    	{	ControlRef browser = GetDataBrowserFromWindow(window);
751
		    	{	ControlRef browser = GetDataBrowserFromWindow(window);
746
		    		Rect bounds; GetPortBounds(GetWindowPort(window), &bounds);
752
		    		Rect bounds; GetPortBounds(GetWindowPort(window), &bounds);
747
		        	SizeControl(browser, bounds.right - bounds.left, bounds.bottom - bounds.top);
753
		        	SizeControl(browser, bounds.right - bounds.left, bounds.bottom - bounds.top);
748
		    	}	break;
754
		    	}	break;
749
				
755
				
750
							
756
							
751
				 
757
				 
752
			}
758
			}
753
		}	break;
759
		}	break;
754
	}
760
	}
755
	   
761
	   
756
    return result;
762
    return result;
757
}
763
}
758
 
764
 
759
#endif  /* HAVE_AQUA */
765
#endif  /* HAVE_AQUA */
760
 
766
 
761
#endif /* __AQUA_DATA_BROWSER__ */
767
#endif /* __AQUA_DATA_BROWSER__ */