(U+6215): Apply new conventions for glyph granularity.
[chise/xemacs-chise.git.1] / netinstall / localdir.cc
1 /*
2  * Copyright (c) 2000, Red Hat, Inc.
3  *
4  *     This program is free software; you can redistribute it and/or modify
5  *     it under the terms of the GNU General Public License as published by
6  *     the Free Software Foundation; either version 2 of the License, or
7  *     (at your option) any later version.
8  *
9  *     A copy of the GNU General Public License can be found at
10  *     http://www.gnu.org/
11  *
12  * Written by Andrej Borsenkow <Andrej.Borsenkow@mow.siemens.ru>
13  * based on work and suggestions of DJ Delorie
14  *
15  * Sync'ed with cinstall 2001-10-16
16  */
17
18 /* The purpose of this file is to ask the user where they want the
19    root of the installation to be, and to ask whether the user prefers
20    text or binary mounts. */
21
22 #include "win32.h"
23 #include <shlobj.h>
24 #include <stdio.h>
25 #include <stdlib.h>
26 #include <ctype.h>
27 #include <io.h>
28
29 #include "mkdir.h"
30 #include "dialog.h"
31 #include "resource.h"
32 #include "state.h"
33 #include "msg.h"
34 #include "concat.h"
35 #include "log.h"
36
37 static void
38 check_if_enable_next (HWND h)
39 {
40   EnableWindow (GetDlgItem (h, IDOK), local_dir != 0);
41 }
42
43 static void
44 load_dialog (HWND h)
45 {
46   eset (h, IDC_LOCAL_DIR, local_dir);
47   check_if_enable_next (h);
48 }
49
50 static void
51 save_dialog (HWND h)
52 {
53   local_dir = eget (h, IDC_LOCAL_DIR, local_dir);
54 }
55
56
57 static int CALLBACK
58 browse_cb (HWND h, UINT m, LPARAM lp, LPARAM data)
59 {
60   switch (m)
61     {
62     case BFFM_INITIALIZED:
63       if (local_dir)
64         SendMessage (h, BFFM_SETSELECTION, TRUE, (LPARAM)local_dir);
65       break;
66     }
67   return 0;
68 }
69
70 static void
71 browse (HWND h)
72 {
73   BROWSEINFO bi;
74   CHAR name[MAX_PATH];
75   LPITEMIDLIST pidl;
76   memset (&bi, 0, sizeof (bi));
77   bi.hwndOwner = h;
78   bi.pszDisplayName = name;
79   bi.lpszTitle = "Select download directory";
80   bi.ulFlags = BIF_RETURNONLYFSDIRS;
81   bi.lpfn = browse_cb;
82   pidl = SHBrowseForFolder (&bi);
83   if (pidl)
84     {
85       if (SHGetPathFromIDList (pidl, name))
86         eset (h, IDC_LOCAL_DIR, name);
87     }
88 }
89
90
91 static BOOL
92 dialog_cmd (HWND h, int id, HWND hwndctl, UINT code)
93 {
94   switch (id)
95     {
96
97     case IDC_LOCAL_DIR:
98       save_dialog (h);
99       check_if_enable_next (h);
100       break;
101
102     case IDC_LOCAL_DIR_BROWSE:
103       browse (h);
104       break;
105
106     case IDOK:
107       save_dialog (h);
108       if (_access (local_dir, 0) != 0 && yesno (IDS_CREATE_DIR, local_dir) == IDYES)
109         {
110           log (0, "Created install directory %s\n", local_dir);
111           mkdir_p (1, local_dir);
112         }
113       if (SetCurrentDirectoryA (local_dir))
114         {
115           switch (source)
116             {
117             case IDC_SOURCE_DOWNLOAD:
118               NEXT (IDD_NET);
119               break;
120             case IDC_SOURCE_NETINST:
121             case IDC_SOURCE_CWD:
122               NEXT (IDD_ROOT);
123               break;
124             default:
125               NEXT (0);
126               break;
127             }
128         }
129       else
130         note (IDS_ERR_CHDIR, local_dir);
131
132       break;
133
134     case IDC_BACK:
135       save_dialog (h);
136       NEXT (IDD_SOURCE);
137       break;
138
139     case IDCANCEL:
140       NEXT (0);
141       break;
142     }
143 }
144
145 static BOOL CALLBACK
146 dialog_proc (HWND h, UINT message, WPARAM wParam, LPARAM lParam)
147 {
148   switch (message)
149     {
150     case WM_INITDIALOG:
151       load_dialog (h);
152       return FALSE;
153     case WM_COMMAND:
154       return HANDLE_WM_COMMAND (h, wParam, lParam, dialog_cmd);
155     }
156   return FALSE;
157 }
158
159 extern char cwd[_MAX_PATH];
160
161 void
162 do_local_dir (HINSTANCE h)
163 {
164   int rv = 0;
165   rv = DialogBox (h, MAKEINTRESOURCE (IDD_LOCAL_DIR), 0, dialog_proc);
166   if (rv == -1)
167     fatal (IDS_DIALOG_FAILED);
168
169   log (0, "Selected local directory: %s", local_dir);
170 }
171