/*Copyright (c) Anker Berg-Sonne, 1985,1986,1987*/ #include "proto.h" #include "commdlg.h" #include "print.h" char szAppName[10]; char szWindowTitle[30]; HANDLE hInst, hCursor; FARPROC lpprocAbout; FARPROC lpprocPrompt; HWND Curr_Wnd, Buf_Wnd[Maxbuffers]; LOGFONT LF; int Char_Width, Rfreshed=0, Char_Height, Dragging=0, DragX, DragY; int Ch_Ch, Ch_Count=0, First=1, Cursor_On=0, Sav_Cur, Def_Height, Def_Width, Saved_Num_Lock, Lst_Index; char Work[80]; struct SREGS Rrv; char Fil_String[128], Sel_Dir[80]; char Keyb_State[256]; int Save_My_Num_Lock, Save_Their_Num_Lock; extern int __argc; extern char **__argv; BOOL FAR PASCAL _export About(HWND hDlg,unsigned message,WORD W,LONG L) {if (message == WM_COMMAND) {EndDialog( hDlg, TRUE ); return TRUE; } else if (message == WM_INITDIALOG) return TRUE; else return FALSE; } void SedtPaint(HWND H,PAINTSTRUCT *pps,int Is_Current ) {HBRUSH hbr, hbrOld; HDC hDC; if (Rfreshed) {Rfreshed=0; return; } hDC=pps->hdc; if (pps->fErase) {hbr = CreateSolidBrush( GetSysColor(COLOR_WINDOW) ); hbrOld = (HBRUSH)SelectObject( hDC, (HANDLE)hbr ); FillRect( hDC, (LPRECT)&pps->rcPaint, hbr ); SelectObject( hDC, (HANDLE)hbrOld ); DeleteObject( (HANDLE)hbr ); } SetBkMode( hDC, OPAQUE); if (Out_Count) Out_Zap(); S_Header(); if (In_Help) {Display_Help(Help_Pos); Out_Zap(); Win_On_Curs(); } else {if (Show_Ruler) S_Ruler(); Fill_Screen(Rel_First,Rel_Last); if (!Is_Current) Mark_Cursor(); Out_Zap(); } } BOOL SedtInit(HANDLE hInstance ) {WNDCLASS SedtClass; LoadString( hInstance, IDSNAME, (LPSTR)szAppName, 10 ); LoadString( hInstance, IDSTITLE, (LPSTR)szWindowTitle, 30 ); SedtClass.hCursor = LoadCursor( (HINSTANCE) NULL, (LPCSTR)IDC_IBEAM ); SedtClass.hIcon = LoadIcon( hInstance, (LPSTR)szAppName ); SedtClass.lpszMenuName = (LPSTR)"SedtMenu"; SedtClass.lpszClassName = (LPSTR)szAppName; SedtClass.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH ); SedtClass.hInstance = hInstance; SedtClass.style = CS_VREDRAW | CS_HREDRAW | CS_CLASSDC; SedtClass.lpfnWndProc = SedtWndProc; SedtClass.cbClsExtra = 0; SedtClass.cbWndExtra = 0; if (!RegisterClass( &SedtClass ) ) return FALSE; return TRUE; /* Initialization succeeded */ } int Make_Window(int B,int Show) {HWND hWnd; HMENU hMenu, hMenu1; HDC hDC; RECT Rect; TEXTMETRIC TM; HANDLE Old_Font; LOGFONT SLF; int I; if ((hWnd = CreateWindow((LPSTR)szAppName, (LPSTR)szWindowTitle, WS_OVERLAPPED|WS_VSCROLL|WS_MINIMIZEBOX|WS_MAXIMIZEBOX| WS_THICKFRAME|WS_SYSMENU, CW_USEDEFAULT,0,CW_USEDEFAULT,0, (HWND)NULL, /* no parent */ (HMENU)NULL, /* use class menu */ (HANDLE)hInst, /* handle to window instance */ (LPSTR)NULL /* no params to pass on */ ))==(HWND)NULL) return 0; Curr_Wnd=Buf_Wnd[B]=hWnd; hDC = GetDC( hWnd ); LF.lfWidth=0; LF.lfEscapement=0; LF.lfOrientation=0; LF.lfItalic=0; LF.lfUnderline=0; LF.lfStrikeOut=0; LF.lfCharSet=ANSI_CHARSET; LF.lfOutPrecision=OUT_DEFAULT_PRECIS; LF.lfClipPrecision=CLIP_DEFAULT_PRECIS; LF.lfQuality=DRAFT_QUALITY; LF.lfPitchAndFamily=FF_MODERN; if (Def_Font!=0) {strcpy(LF.lfFaceName,"Courier New"); LF.lfWeight=FW_BOLD; LF.lfHeight= -Def_Font; } else {strcpy(LF.lfFaceName,"Fixedsys"); LF.lfWeight=FW_DONTCARE; LF.lfHeight=-9; } SLF=LF; SLF.lfHeight=MulDiv(SLF.lfHeight,GetDeviceCaps(hDC,LOGPIXELSY),72); Buf_Font=CreateFontIndirect((LPLOGFONT)&SLF); Old_Font=SelectObject(hDC,Buf_Font); GetTextMetrics( hDC, (LPTEXTMETRIC)&TM ); SelectObject(hDC,Old_Font); GetClientRect(Curr_Wnd,(LPRECT)&Rect); Scr_Width=(Rect.right+1)/(Char_Width=TM.tmAveCharWidth); Scr_Length=(Rect.bottom+1)/(Char_Height=TM.tmHeight); ReleaseDC( hWnd, hDC ); SetScrollRange(hWnd,SB_VERT,0,100,1); if (Zoom_Windows) ShowWindow(hWnd,Show|SW_SHOWMAXIMIZED); else ShowWindow( hWnd, Show ); Rfreshed=1; UpdateWindow( hWnd ); hMenu=GetMenu(hWnd); for (I=0;I=Scr_Width) {while (My_Col-Scr_Shift>=Scr_Width) Scr_Shift+=Shift_Screen?Shift_Screen:Scr_Width/2; } } Offset=Rel_First+Rel_Last; Rel_First=Show_Ruler?3:2; Rel_Last=Scr_Length-2; My_Line=Home=(Rel_First+Rel_Last+1)/2; Rel_First-=Home; Rel_Last-=Home; if (Float_Cursor) Set_Offset(Offset); SetCaretPos((int)(Char_Width*(My_Col-Scr_Shift-1)), (int)(Char_Height*(My_Line-1))); } if (!Is_Current) Restore_Window(B); break; case WM_ERASEBKGND: GetClientRect( hWnd, (LPRECT)&rect ); hbr = CreateSolidBrush( GetSysColor(COLOR_WINDOW) ); hbrOld = (HBRUSH)SelectObject( (HDC)wParam, (HANDLE)hbr ); FillRect( (HDC)wParam, (LPRECT)&rect, hbr ); SelectObject( (HDC)wParam, (HANDLE)hbrOld ); DeleteObject( (HANDLE)hbr ); break; case WM_QUERYENDSESSION: for (I=0;IBuf_Lines) Ent_Count=Buf_Lines; Abs_Line(); break; } Move_Entity(); Upd_Header(); Win_On_Curs(); } Out_Zap(); break; case WM_COMMAND: if (In_Help) break; if (!Mouse_OK) break; Win_Off_Curs(); switch (wParam) {case FILE_OPEN: if (Open_File_Dialog()) {Make_File(); Count=1; Edit_File(Com_Arg); Upd_Header(); } break; case FILE_SAVE: if ((S=Outfile)==NULL||S[0]==0) Error(2,No_Output_File_Txt); else {Wr_Buffer(S); } if (!Err_Flag) Clr_Changes(); Upd_Header(); break; case FILE_SAVE_AS: if (Save_As_Dialog()) {Make_File(); strcpy(New_File,Com_Arg); Wr_Buffer(Outfile=New_File); S_Header(); if (!Err_Flag) Clr_Changes(); Upd_Header(); } break; case FILE_INSERT: if (Open_File_Dialog()) {Make_File(); Include_File(Com_Arg,File_Not_Found_Txt); Fill_Screen(0,Rel_Last); Set_Changes(); S_Header(); } break; case FILE_QUIT: if (In_Help) break; Win_Quit(); break; case FILE_ABOUT: DialogBox( hInst, MAKEINTRESOURCE(ABOUTBOX), hWnd, lpprocAbout ); break; case FILE_PRINT: Print_Buffer(); break; case WINDOW_0: case WINDOW_1: case WINDOW_2: case WINDOW_3: Ch_Window(wParam-20); break; case WINDOW_SWITCH: Other_Window(); break; case FILE_NEW: Zero(); break; case EDIT_CLEAR: Reset(); break; case EDIT_CUT: This_Cmd=C_Delete; Init_Entity(); Sel_Range(); if (!Err_Flag) {if (Blk_Mode) Blk_Rem_It(Past_String); else Rem_It(Past_String); Set_Changes(); } break; case EDIT_PASTE: Count=1; Paste(); Upd_Header(); break; case RULER_0: case RULER_1: case RULER_2: case RULER_3: case RULER_4: case RULER_5: case RULER_6: case RULER_7: case RULER_8: case RULER_9: Readruler((char)('0'+wParam-40)); if (Show_Ruler) S_Ruler(); break; case HELP: strcpy(Com_Arg,Do_Mapping("HELP.HLP")); Do_Help(); break; case FONT_SELECT: Win_Font(); break; } Out_Zap(); Win_On_Curs(); break; default: return DefWindowProc( hWnd, message, wParam, lParam ); } return(0L); } void Win_Scroll(int T,int B,int S) {RECT Rect; Rect.top=(T-1)*Char_Height; Rect.bottom=B*Char_Height; Rect.left=0; Rect.right=Scr_Width*Char_Width; ScrollWindow(Curr_Wnd,0,-S*Char_Height,&Rect,&Rect); Rfreshed=1; UpdateWindow(Curr_Wnd); } void Win_Clear() {HDC hDC; RECT rect; HBRUSH hbr, hbrOld; hDC = GetDC(Curr_Wnd); GetClientRect( Curr_Wnd, (LPRECT)&rect ); hbr = CreateSolidBrush( GetSysColor(COLOR_WINDOW) ); hbrOld = (HBRUSH)SelectObject( hDC, (HANDLE)hbr ); FillRect( hDC, (LPRECT)&rect, hbr ); SelectObject( hDC, (HANDLE)hbrOld ); DeleteObject( (HANDLE)hbr ); ReleaseDC(Curr_Wnd, hDC ); } void Win_Erase(int L,int C,int W) {HDC hDC; RECT rect; HBRUSH hbr, hbrOld; hDC = GetDC(Curr_Wnd); rect.top=(L-1)*Char_Height; rect.left=(C-1)*Char_Width; rect.bottom=rect.top+Char_Height; rect.right=rect.left+W*Char_Width; hbr = CreateSolidBrush( GetSysColor(COLOR_WINDOW) ); hbrOld = (HBRUSH)SelectObject( hDC, (HANDLE)hbr ); FillRect( hDC, (LPRECT)&rect, hbr ); SelectObject( hDC, (HANDLE)hbrOld ); DeleteObject( (HANDLE)hbr ); ReleaseDC(Curr_Wnd, hDC ); } void Win_On_Curs() { if (Cursor_On) Win_Off_Curs(); SetCaretPos((int)(Char_Width*(My_Col-Scr_Shift-1)), (int)(Char_Height*(My_Line-1))); ShowCaret(Curr_Wnd); Cursor_On=1; } void Win_Off_Curs() { HideCaret(Curr_Wnd ); Cursor_On=0; } void Win_Getmem(HANDLE H,int A,int L) {LPSTR P; P=GlobalLock(H); LockData(0); segread(&Rrv); movedata(HIWORD(P),LOWORD(P),Rrv.ds,A,L); UnlockData(0); GlobalUnlock(H); } void Win_Putmem(int A,HANDLE H,int L) {LPSTR P; P=GlobalLock(H); LockData(0); segread(&Rrv); movedata(Rrv.ds,A,HIWORD(P),LOWORD(P),L); UnlockData(0); GlobalUnlock(H); } HANDLE Win_Alloc(int L) { return GlobalAlloc(GMEM_MOVEABLE,(long)L); } void Win_Free(HANDLE H) { GlobalFree(H); } void WinText(int L,int C,char *S,int A) {HDC hDC; HANDLE Old_Font; hDC = GetDC(Curr_Wnd); Old_Font=SelectObject(hDC,Buf_Font); SetBkMode( hDC, OPAQUE); if (A&A_Reverse) {SetTextColor(hDC,GetSysColor(COLOR_WINDOW)); SetBkColor(hDC,GetSysColor(COLOR_WINDOWTEXT)); } else {SetTextColor( hDC, GetSysColor(COLOR_WINDOWTEXT) ); SetBkColor(hDC,GetSysColor(COLOR_WINDOW)); } TextOut(hDC,Char_Width*(C-1),Char_Height*(L-1), (char FAR *)S,strlen(S)); SelectObject(hDC,Old_Font); ReleaseDC(Curr_Wnd, hDC ); } void WinChar() {static MSG msg; int I; static Last_Character, Last_Scancode; if (Ch_Count>0) {Ch_Count--; Character=Last_Character; Scancode=Last_Scancode; return; } Rfreshed=0; while (1) {if (Working_Flag) Clr_Working(); Err_Flag=0; if (!GetMessage((LPMSG)&msg,(HWND)NULL,0,0)) {Not_End=0; return; } if (msg.message==WM_CHAR) {Ch_Count=(int)(msg.lParam&0xFFFF)-1; Last_Character=Character=msg.wParam; if (Do_Debug) Diag("Character:Scancode=%d,Character=%d",Scancode,Character); return; } else if (msg.message==WM_KEYDOWN) {Ch_Count=(int)(msg.lParam&0xFFFF)-1; Last_Scancode=Scancode=(int)(msg.lParam>>16)&0xFF; if (Set_Num_Lock!=-1&&Scancode==0x45) {GetKeyboardState((BYTE far *)Keyb_State); Keyb_State[VK_NUMLOCK]=Set_Num_Lock; SetKeyboardState((BYTE far *)Keyb_State); } if (Do_Debug) Diag("Scancode=%d,Window code=%d",Scancode,msg.wParam); for (I=0;I0) SetDlgItemText(hDlg,PROMPTINPUT,(LPSTR)Lst_Input[--Lst_Index]); break; case PROMPTPREV: if (Lst_Index<9) SetDlgItemText(hDlg,PROMPTINPUT,(LPSTR)Lst_Input[++Lst_Index]); break; } break; case WM_INITDIALOG: Prompt_Init(hDlg); break; default: return FALSE; } return TRUE; } int Win_Newwindow(int B,int Show) { return Make_Window(B,Show); } void Win_Topwindow(int B) { SetFocus(Curr_Wnd=Buf_Wnd[B]); } void Swap_Window(int B) { Out_Zap(); Sav_Window(Cur_Buffer); Sav_Cur=Cur_Buffer; Cur_Buffer=B; Current=(&Main_Buffer); Load_Window(Cur_Buffer); Curr_Wnd=Buf_Wnd[B]; } void Restore_Window(int I) { Out_Zap(); Sav_Window(Cur_Buffer); Cur_Buffer=Sav_Cur; Current=(&Main_Buffer); Load_Window(Cur_Buffer); Curr_Wnd=Buf_Wnd[Cur_Buffer]; } void Win_Name(char *S) {int I; HMENU hMenu; strcpy(Com_Arg,(char *)Txt_Sedt); if (S==NULL) strcat(Com_Arg,(char *)Txt_Untitled); else strcat(Com_Arg,S); SetWindowText(Curr_Wnd,Com_Arg); for (I=0;I0) LF.lfHeight*=-1; LF.lfHeight--; LF.lfWidth=0; SLF=LF; SLF.lfHeight=MulDiv(SLF.lfHeight,GetDeviceCaps(hDC,LOGPIXELSY),72); Buf_Font=CreateFontIndirect(&SLF); Old_Font=SelectObject(hDC,Buf_Font); GetClientRect(Curr_Wnd,(LPRECT)&Rect); GetTextMetrics( hDC, (LPTEXTMETRIC)&TM ); Scr_Width=(Rect.right+1)/(Char_Width=TM.tmAveCharWidth); Scr_Length=(Rect.bottom+1)/(Char_Height=TM.tmHeight); if (Cursor_On) HideCaret(Curr_Wnd); DestroyCaret(); CreateCaret( Curr_Wnd, (HBITMAP)NULL,(int)Char_Width, (int)Char_Height); SetCaretPos((int)(Char_Width*(My_Col-Scr_Shift-1)), (int)(Char_Height*(My_Line-1))); if (Cursor_On) ShowCaret(Curr_Wnd); SelectObject(hDC,Old_Font); ReleaseDC(Curr_Wnd,hDC); Refresh(); } void Win_Smaller() {RECT Rect; HDC hDC; TEXTMETRIC TM; HANDLE Old_Font; LOGFONT SLF; hDC = GetDC(Curr_Wnd); DeleteObject(Buf_Font); if (LF.lfHeight>0) LF.lfHeight*=-1; LF.lfHeight++; LF.lfWidth=0; SLF=LF; SLF.lfHeight=MulDiv(SLF.lfHeight,GetDeviceCaps(hDC,LOGPIXELSY),72); Buf_Font=CreateFontIndirect(&SLF); Old_Font=SelectObject(hDC,Buf_Font); GetClientRect(Curr_Wnd,(LPRECT)&Rect); GetTextMetrics( hDC, (LPTEXTMETRIC)&TM ); Scr_Width=(Rect.right+1)/(Char_Width=TM.tmAveCharWidth); Scr_Length=(Rect.bottom+1)/(Char_Height=TM.tmHeight); if (Cursor_On) HideCaret(Curr_Wnd); DestroyCaret(); CreateCaret( Curr_Wnd, (HBITMAP)NULL,(int)Char_Width, (int)Char_Height); SetCaretPos((int)(Char_Width*(My_Col-Scr_Shift-1)), (int)(Char_Height*(My_Line-1))); if (Cursor_On) ShowCaret(Curr_Wnd); SelectObject(hDC,Old_Font); ReleaseDC(Curr_Wnd,hDC); Refresh(); } void Win_Set_Num_Lock(void) {Save_My_Num_Lock=1; GetKeyboardState((BYTE far *)Keyb_State); Save_Their_Num_Lock=Keyb_State[VK_NUMLOCK]; Keyb_State[VK_NUMLOCK]=1; SetKeyboardState((BYTE far *)Keyb_State); } void Win_Clear_Num_Lock(void) {Save_My_Num_Lock=0; GetKeyboardState((BYTE far *)Keyb_State); Save_Their_Num_Lock=Keyb_State[VK_NUMLOCK]; Keyb_State[VK_NUMLOCK]=0; SetKeyboardState((BYTE far *)Keyb_State); } void Win_Reset_Num_Lock(void) {GetKeyboardState((BYTE far *)Keyb_State); Keyb_State[VK_NUMLOCK]=Save_Their_Num_Lock; SetKeyboardState((BYTE far *)Keyb_State); } int Open_File_Dialog() {OPENFILENAME Ofn; Ofn.lStructSize=sizeof(OPENFILENAME); Ofn.hwndOwner=Curr_Wnd; Ofn.lpstrFilter=NULL; Ofn.lpstrCustomFilter=NULL; strcpy(Fil_String,"*.*"); Ofn.lpstrFile=Fil_String; Ofn.nMaxFile=128; Ofn.lpstrFileTitle=NULL; Ofn.lpstrInitialDir=Sel_Dir; Ofn.lpstrTitle=NULL; Ofn.Flags=OFN_PATHMUSTEXIST|OFN_HIDEREADONLY; Ofn.lpstrDefExt=NULL; if (GetOpenFileName(&Ofn)) {strcpy(Com_Arg,Fil_String); strncpy(Sel_Dir,Fil_String,Ofn.nFileOffset); Sel_Dir[Ofn.nFileOffset]=0; return 1; } else return 0; } int Save_As_Dialog() {OPENFILENAME Ofn; Ofn.lStructSize=sizeof(OPENFILENAME); Ofn.hwndOwner=Curr_Wnd; Ofn.lpstrFilter=NULL; Ofn.lpstrCustomFilter=NULL; strcpy(Fil_String,Outfile); Ofn.lpstrFile=Fil_String; Ofn.nMaxFile=128; Ofn.lpstrFileTitle=NULL; Ofn.lpstrInitialDir=NULL; Ofn.lpstrTitle=NULL; Ofn.Flags=OFN_PATHMUSTEXIST|OFN_HIDEREADONLY; Ofn.lpstrDefExt=NULL; if (GetSaveFileName(&Ofn)) {strcpy(Com_Arg,Fil_String); strncpy(Sel_Dir,Fil_String,Ofn.nFileOffset); Sel_Dir[Ofn.nFileOffset]=0; return 1; } else return 0; } void Print_Buffer() {PRINTDLG Dlg; memset(&Dlg,0,sizeof(PRINTDLG)); Dlg.lStructSize=sizeof(PRINTDLG); Dlg.hwndOwner=Curr_Wnd; Dlg.Flags=PD_RETURNDC|PD_NOPAGENUMS|PD_NOSELECTION; if (PrintDlg(&Dlg)) {int X, Y, MaxX, MaxY, Char_Width, Char_Height; long Save_Col; char Output[100]; int Out_Length=0, Out_X, Out_Y, I; TEXTMETRIC TM; DOCINFO DI; HANDLE Font; LOGFONT PLF; SetCursor(LoadCursor((HINSTANCE)NULL,IDC_WAIT)); PLF=LF; PLF.lfHeight=MulDiv(PLF.lfHeight,GetDeviceCaps(Dlg.hDC,LOGPIXELSY),72); Font=CreateFontIndirect(&PLF); MaxX=GetDeviceCaps(Dlg.hDC,HORZRES); MaxY=GetDeviceCaps(Dlg.hDC,VERTRES); SelectObject(Dlg.hDC,Font); GetTextMetrics( Dlg.hDC, (LPTEXTMETRIC)&TM ); Char_Width=TM.tmAveCharWidth; Char_Height=TM.tmHeight; DI.cbSize=sizeof(DOCINFO); DI.lpszDocName=Outfile; DI.lpszOutput=NULL; StartDoc(Dlg.hDC,&DI); StartPage(Dlg.hDC); B_Goto(Current,1); X=0; Y=Char_Height*4; Save_Col=My_Col; My_Col=1; while (Current->Pos<=Current->Bufsize) {char C, Rep[10]; int L; C=B_Get(Current); if (C==12) {if (Out_Length>0) {TextOut(Dlg.hDC,Out_X,Out_Y,Output,Out_Length); Out_Length=0; } EndPage(Dlg.hDC); StartPage(Dlg.hDC); SelectObject(Dlg.hDC,Font); X=0; My_Col=1; Y=Char_Height*4; } else if (C==10) {if (Out_Length>0) {TextOut(Dlg.hDC,Out_X,Out_Y,Output,Out_Length); Out_Length=0; } X=0; My_Col=1; Y+=Char_Height; if (Y>MaxY-Char_Height*4&&MaxY!=0) {EndPage(Dlg.hDC); StartPage(Dlg.hDC); SelectObject(Dlg.hDC,Font); Y=Char_Height*4; } } else if (C==13) ; else if (X<=MaxX||MaxX==0) {L=Char_Rep(C,Rep); if (Out_Length+L>100) {TextOut(Dlg.hDC,Out_X,Out_Y,Output,Out_Length); Out_Length=0; } if (Out_Length==0) {Out_X=X; Out_Y=Y; } for (I=0;I<=L;I++) Output[Out_Length+I]=Rep[I]; Out_Length+=L; X+=Char_Width*L; My_Col+=L; } } if (Out_Length>0) {TextOut(Dlg.hDC,Out_X,Out_Y,Output,Out_Length); Out_Length=0; } My_Col=Save_Col; EndPage(Dlg.hDC); EndDoc(Dlg.hDC); DeleteDC(Dlg.hDC); DeleteObject(Font); if (Dlg.hDevMode!=(HGLOBAL)NULL) GlobalFree(Dlg.hDevMode); if (Dlg.hDevNames!=(HGLOBAL)NULL) GlobalFree(Dlg.hDevNames); SetCursor(LoadCursor((HINSTANCE)NULL,IDC_IBEAM)); } }