source: abuse/tags/pd/macabuse/imlib/filesel.c @ 604

Last change on this file since 604 was 49, checked in by Sam Hocevar, 15 years ago
  • Imported original public domain release, for future reference.
  • Property svn:keywords set to Id
File size: 3.6 KB
Line 
1#include "filesel.hpp"
2#include "input.hpp"
3#include "scroller.hpp"
4#include "jdir.hpp"
5
6#ifdef __WATCOMC__
7#include <direct.h>
8#endif
9
10#ifdef __MAC__
11extern char *macify_name(char *s);
12#endif
13
14class file_picker : public spicker
15{
16  char **f,**d;
17  int tf,td,wid,sid;
18  char cd[300];
19  public:
20  file_picker(int X, int Y, int ID, int Rows, ifield *Next);
21  virtual int total() { return tf+td; }
22  virtual int item_width(window_manager *wm) { return wm->font()->width()*wid; }
23  virtual int item_height(window_manager *wm) { return wm->font()->height()+1; }
24  virtual void draw_item(window_manager *wm, image *screen, int x, int y, int num, int active);
25  virtual void note_selection(window_manager *wm, image *screen, input_manager *inm, int x);
26  void free_up();
27  ~file_picker() { free_up(); }
28} ;
29
30void file_picker::free_up()
31{
32  int i=0;
33  for (;i<tf;i++)
34    jfree(f[i]);
35  for (i=0;i<td;i++)
36    jfree(d[i]);
37  if (tf) jfree(f);
38  if (td) jfree(d);
39}
40
41void file_picker::note_selection(window_manager *wm, image *screen, input_manager *inm, int x)
42{
43  if (x<td)
44  {
45    if (strcmp(d[x],"."))
46    {
47      int x1,y1,x2,y2;
48      area(x1,y1,x2,y2,wm);
49      screen->bar(x1,y1,x2,y2,wm->medium_color());
50
51      char st[200],curdir[200];
52      sprintf(st,"%s/%s",cd,d[x]);
53     
54#ifdef __MAC__
55                        if (strcmp(d[x],".."))
56                                strcpy(cd,st);
57                        else
58                        {
59                                int i=strlen(cd);
60                               
61                                if (cd[i-1] == '.' && cd[i-2] == '.')
62                                        strcpy(cd,st);
63                                else
64                                {
65                                        while (i>=0 && cd[i] != '/')
66                                                i--;
67                                        if (i>=0)
68                                                cd[i] = 0;
69                                }
70                        }                               
71#else
72      getcwd(curdir,200);
73#ifdef __MAC__
74      chdir(macify_name(st));
75#else
76                        chdir(st);
77#endif
78      getcwd(cd,200);
79      chdir(curdir);
80#endif
81      free_up();
82      get_directory(cd,f,tf,d,td);
83      wid=0;
84      int i=0;
85      for (;i<tf;i++)
86      if (strlen(f[i])>wid) wid=strlen(f[i]);
87      for (i=0;i<td;i++)
88      if (strlen(d[i])+2>wid) wid=strlen(d[i])+2;
89      sx=0;
90
91      reconfigure(); 
92      draw_first(screen,wm);
93    }
94  } else
95  {
96    char nm[200];
97    sprintf(nm,"%s/%s",cd,f[x-td]);
98    text_field *link=(text_field *)inm->get(sid);
99    link->change_data(nm,strlen(nm),1,screen,wm);
100  }
101
102}
103
104void file_picker::draw_item(window_manager *wm, image *screen, int x, int y, int num, int active)
105{
106  if (active)
107    screen->bar(x,y,x+item_width(wm)-1,y+item_height(wm)-1,wm->black());
108
109  if (num<td)
110  {
111    char st[100];
112    sprintf(st,"<%s>",d[num]);
113    wm->font()->put_string(screen,x,y,st,wm->bright_color());
114  } else
115    wm->font()->put_string(screen,x,y,f[num-td],wm->bright_color());
116}
117
118file_picker::file_picker(int X, int Y, int ID, int Rows, ifield *Next)
119  : spicker(X,Y,0,Rows,1,1,0,Next)
120{
121 
122  sid=ID;
123
124  strcpy(cd,".");
125 
126  get_directory(cd,f,tf,d,td);
127  wid=0;
128  int i=0;
129  for (;i<tf;i++)
130    if (strlen(f[i])>wid) wid=strlen(f[i]);
131  for (i=0;i<td;i++)
132    if (strlen(d[i])+2>wid) wid=strlen(d[i])+2;
133  reconfigure(); 
134}
135
136jwindow *file_dialog(window_manager *wm, char *prompt, char *def,
137                     int ok_id, char *ok_name, int cancel_id, char *cancel_name, char *FILENAME_str, int filename_id)
138{
139  int wl=WINDOW_FRAME_LEFT,wh=WINDOW_FRAME_TOP;
140  int wh2=wh+5+wm->font()->height()+5;
141  int wh3=wh2+wm->font()->height()+12;
142  jwindow *j=wm->new_window(0,0,-1,-1,
143                            new info_field(wl+5,wh+5,0,prompt,
144                            new text_field(wl,wh2,filename_id,
145                                           ">","****************************************",def,
146                            new button(wl+50,wh3,ok_id,     ok_name,
147                            new button(wl+100,wh3,cancel_id,cancel_name,
148                            new file_picker(wl+15,wh3+wm->font()->height()+10,filename_id,8,
149                                          NULL))))),
150
151                            FILENAME_str);
152  return j;
153}
154
155
156
157
158
Note: See TracBrowser for help on using the repository browser.