File: mxUtils.m

package info (click to toggle)
mysql-gui-tools 5.0r14%2BopenSUSE-2.1
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 116,956 kB
  • ctags: 48,715
  • sloc: sql: 341,918; pascal: 276,698; ansic: 91,020; cpp: 90,451; objc: 33,236; sh: 29,481; yacc: 10,756; xml: 10,589; java: 10,079; php: 2,806; python: 2,092; makefile: 1,783; perl: 4
file content (209 lines) | stat: -rw-r--r-- 5,574 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
//
//  mxUtils.m
//  MySQLGUICommon
//
//  Created by Alfredo Kojima on 9/20/04.
//  Copyright 2004 MySQL AB. All rights reserved.
//

#import "mxUtils.h"

#define N_(s) s


NSString *MXGetErrorString(MYX_LIB_ERROR error)
{
  static NSString *msgs[]= {
    @"",
    N_(@"Can't open file."),
    N_(@"Can't connect to server instance."),
    N_(@"Error parsing XML file."),
    N_(@"Error parsing XML file (bad document)."),
    N_(@"Error parsing XML file (empty document)."),
    N_(@"Error executing SQL command."),
    N_(@"Executing stopped."),
    N_(@"Internal error in libxml (could not change memory allocators)."),
    N_(@"The object was not found in the database."),
    N_(@"Cannot read from file."),
    N_(@"Error during character set conversion."),
    N_(@"Invalid character set specified.")
  };

  if (error < sizeof(msgs)/sizeof(NSString*))
    return NSLocalizedString(msgs[error], nil);
  else
    return @"Unknown error.";
}


void MXRunAlertPanelWithError(NSString *title, NSString *message, MYX_LIB_ERROR error)
{
  NSString *errmsg= MXGetErrorString(error);
  
  NSRunAlertPanel(title, @"%@\n%@", nil, nil, nil, message, 
                  errmsg,nil);
}

void MXRunAlertPanelWithMySQLError(NSString *title, NSString *message, MYSQL *mysql)
{
  char *tmp;
  NSRunAlertPanel(title, @"%@\n%s (error %i)", nil, nil, nil, message, 
                  tmp= myx_mysql_error(mysql), myx_mysql_errno(mysql));
  g_free(tmp);
}


NSImage *MXGetImageFromBundle(NSBundle *bundle, NSString *image)
{
  NSString *path= [bundle pathForResource:[image stringByDeletingPathExtension]
                                   ofType:[image pathExtension]];
  if (!path)
    return nil;
  
  return [[[NSImage alloc] initWithContentsOfFile:path] autorelease];
}


@interface mxUtilsClass : NSObject
{
}
@end
@implementation mxUtilsClass
@end


NSImage *MXGetCommonImage(MXCommonImage img)
{
  static NSString *commonImages[]= {
    @"mini_error.png",
    @"mini_warning.png",
    @"mini_notice.png"
  };
  static NSMutableDictionary *imageCache= nil;
  NSImage *image;
  
  if (!imageCache)
    imageCache= [[NSMutableDictionary alloc] init];
  
  image= [imageCache objectForKey:commonImages[img]];
  if (!image)
  {
    image= MXGetImageFromBundle([NSBundle bundleForClass:[mxUtilsClass class]], commonImages[img]);
    [imageCache setObject:image forKey:commonImages[img]];
  }
  return image;
}


void MXExpandOutline(NSOutlineView *outline, BOOL expandChildren)
{
  id ds= [outline dataSource];
  id item;
  int i;
  int count= [ds outlineView:outline numberOfChildrenOfItem:nil];

  for (i= 0; i < count; i++)
  {
    item= [ds outlineView:outline child:i ofItem:nil];
    [outline expandItem:item expandChildren:expandChildren];
  }
}


static NSDictionary *getExpandedItems(NSOutlineView *outline, id dataSource, 
                                      id pitem, int levels, id column)
{
  NSMutableDictionary *dict= [NSMutableDictionary dictionary];
  unsigned int i, count= [dataSource outlineView:outline numberOfChildrenOfItem:pitem];
  
  for (i= 0; i < count; i++)
  {
    id item= [dataSource outlineView:outline child:i ofItem:pitem];
    if ([outline isExpandable:item] && [outline isItemExpanded:item])
    {
      id key= [dataSource outlineView:outline
              objectValueForTableColumn:column 
                                 byItem:item];
      id value;
      if (levels > 0 || levels < 0)
        value= getExpandedItems(outline, dataSource, item, levels-1, column);
      else
        value= [NSNull null];
      [dict setObject:value forKey:key];
    }
  }
  return dict;
}


NSDictionary *MXGetExpandedOutlineItems(NSOutlineView *outline, int levels, id column)
{
  if (!column) column= [[outline tableColumns] objectAtIndex:0];
  return getExpandedItems(outline, [outline dataSource], nil, levels, column);
}


static void expandItems(NSDictionary *dict, NSOutlineView *outline, 
                        id dataSource, id pitem, id column)
{
  int count= [dataSource outlineView:outline numberOfChildrenOfItem:pitem];
  unsigned int i;

  for (i= 0; i < count; i++)
  {
    id item= [dataSource outlineView:outline child:i ofItem:pitem];
    id key= [dataSource outlineView:outline
            objectValueForTableColumn:column 
                               byItem:item];
    NSDictionary *subdict;
    
    if ((subdict= [dict objectForKey:key]))
    {
      [outline expandItem:item];
      if ([subdict isKindOfClass:[NSDictionary class]] && [subdict count] > 0)
        expandItems(subdict, outline, dataSource, item, column);
    }
  }
}


void MXExpandOutlineItems(NSOutlineView *outline, NSDictionary *items, id column)
{
  if (!column) column= [[outline tableColumns] objectAtIndex:0];
  expandItems(items,outline,[outline dataSource],nil,column);
}


void MXResizeTableColumnToFitValue(NSTableView *table, NSTableColumn *column, NSString *value)
{
  NSFont *font= [[column dataCell] font];
  float width;

  width= [font widthOfString:value]+8;
  if (width > [column width])
    [column setWidth:width];
}


void MXResizeTableColumnsToFit(NSTableView *table, NSTableColumn *column)
{
  NSFont *font= [[column dataCell] font];
  float width;
  unsigned int i, c;
  id ds= [table dataSource];
  
  width= [column width];
  
  c= [ds numberOfRowsInTableView:table];  
  for (i= 0; i < c; i++)
  {
    NSString *value= [ds tableView:table objectValueForTableColumn:column row:i];
    float w;
    
    w= [font widthOfString:value];
    if (w > width)
      width= w;
  }
  if (width > [column width])
    [column setWidth:width];  
}