anchor.diff:            return 0;
   
           case IDM_FILE_SAVE:
  -          return 0;
  -
  +          if (szFileName.elementAt(0).cast<Uint16>().value != 0) {
  +            if (file.PopFileWrite(hwndEdit, szFileName)) {
  +              isFileDirty = false;
  +              return 1;
  +            } else {
  +              OkMessage(hwnd,
  +                  'Could not write file ${szFileName.unpackString(MAX_PATH)}');
  +              return 0;
  +            }
  +          }
  +          continue SAVE_AS; // fallthru if file is empty
  +
  +        SAVE_AS:
           case IDM_FILE_SAVE_AS:
  +          if (file.PopFileSaveDlg(hwnd, szFileName, szTitleName) != 0) {
  +            DoCaption(hwnd, szTitleName.unpackString(MAX_PATH));
  +
  +            if (file.PopFileWrite(hwndEdit, szFileName)) {
  +              isFileDirty = false;
  +              return 1;
  +            } else {
  +              OkMessage(hwnd,
  +                  'Could not write file ${szFileName.unpackString(MAX_PATH)}');
  +            }
  +          }
             return 0;
   
           case IDM_FILE_PRINT:
  -          print('fileprint');
  +          OkMessage(hwnd, 'Print not yet implemented!');
             return 0;
   
           case IDM_APP_EXIT:
  
positive.code:             font.NotepadSetFont(hwndEdit);
            }
  
            font.Delete();
            return 0;
  
          case IDM_HELP:
            OkMessage(hwnd, 'Help not yet implemented!');
            return 0;
        }
        return 0;
  
negative.code: 
  int messageFindReplace;
  
  final iSelBeg = allocate<Uint64>()..value = 0;
  final iSelEnd = allocate<Uint64>()..value = 0;
  int iEnable;
  
  Pointer<FINDREPLACE> pfr;
  