Created
August 17, 2018 18:50
-
-
Save ssg/12fe77c65d7232b7491fec1dcc4de27d to your computer and use it in GitHub Desktop.
Initial draft of my first attempt at developing a object-oriented GUI library, DreamView, back in 93.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| Name:DreamView | |
| Date:11th May 93 | |
| Update Info: | |
| 12th May 93 - Added Insert and Delete methods to DView | |
| 12th May 93 - Added REMs | |
| 12th May 93 - Recovered some bugs... | |
| 12th May 93 - Added DInputLine object | |
| 12th May 93 - Added IconButton (file based) object | |
| 13th May 93 - Embedded LoadIcon and MyPutImage to source | |
| 13th May 93 - Recovered some bugs...(About 216) | |
| 13th May 93 - 1:50 Successful compilation... | |
| 13th May 93 - 3:02 Successful compilation of DListViewer... | |
| } | |
| unit DV; {DreamView} | |
| interface | |
| uses graph, | |
| objects, {TRect,TPoint etc etc} | |
| drivers, {TEvent} | |
| ssgmouse, | |
| ssgtools, {Exists function} | |
| bgilink; {Built-in BGI libraries} | |
| const | |
| Version='1.1'; | |
| Cursor:char=#219; | |
| type | |
| PIconBuffer = ^TIconBuffer; | |
| TIconBuffer = Array[1..512] of Byte; | |
| hdr=string[80]; | |
| BitMapType=array[0..1023] of byte; | |
| PView=^DView; {Base Object} | |
| PStrRec=^TStringCollection; | |
| PVRec=^DVRec; {DreamView Child Object Structure} | |
| DVRec=record | |
| ChildView:PView; | |
| Next:PVRec; | |
| end; | |
| DView=object | |
| Origin :TPoint; | |
| Bounds :TRect; | |
| View :TRect; | |
| Event :TEvent; | |
| Header :hdr; | |
| TW,TH :word; | |
| Layers :PVRec; | |
| LayerStart:PVRec; | |
| constructor Init; | |
| procedure Insert(p:PView);virtual; {Insert View to View} | |
| procedure Delete(p:PView);virtual; {Delete View from View} | |
| procedure Draw;virtual; | |
| function MouseInView:boolean;virtual; | |
| procedure HandleEvent(var T:TEvent);virtual; | |
| destructor Done; | |
| end; | |
| DWindow=object(DView) {Base Window Object} | |
| Buffer :Pointer; | |
| BufSize :Word; | |
| Buffered:boolean; | |
| constructor Init(ABounds:TRect;AHeader:hdr;ABuffered:boolean); | |
| procedure Draw;virtual; | |
| procedure HandleEvent(var T:TEvent);virtual; | |
| destructor Done; | |
| end; | |
| DListWindow=object(DWindow) | |
| Descriptor :hdr; | |
| Data :PStrRec; | |
| HighLight :integer; | |
| Top :integer; | |
| VisibleItems:integer; | |
| constructor Init(ABounds:TRect;AHeader:hdr;ADescriptor:hdr;AData:PStrRec;AItems:integer); | |
| procedure Draw;virtual; | |
| procedure HandleEvent(var T:TEvent);virtual; | |
| procedure RefreshList;virtual; | |
| end; | |
| DButton=object(DView) {Header Init} | |
| Pressed:Boolean; | |
| constructor Init(APoint:TPoint;AHeader:hdr); | |
| procedure Draw;virtual; | |
| procedure HandleEvent(var T:TEvent);virtual; | |
| end; | |
| DIconButton=object(DView) | |
| BitMap :TIconBuffer; | |
| Pressed :Boolean; | |
| constructor Init(s:string;APoint:TPoint); | |
| procedure Draw;virtual; | |
| procedure HandleEvent(var T:TEvent);virtual; | |
| end; | |
| DInputLine=object(DView) | |
| Buffer :String; | |
| MaxLen :Byte; | |
| CurPos :Integer; | |
| constructor Init(ABounds:TRect;AMaxLen:Byte); | |
| procedure Draw;virtual; | |
| procedure DelChar(x:integer);virtual; | |
| procedure HandleEvent(var T:TEvent);virtual; | |
| end; | |
| var | |
| DEvent:TEvent; | |
| DVTH,DVTW:integer; | |
| procedure DVInit; | |
| procedure DVDone; | |
| procedure DVError(s:string); | |
| Procedure MyPutImage(X,Y : Integer;Bitmap : TIconBuffer); | |
| Function LoadIcon(FName : String; Var ABuffer : TIconBuffer) : Boolean; | |
| implementation | |
| Procedure MyPutImage(X,Y : Integer;ABitmap : TIconBuffer); | |
| Var | |
| k,t : Integer; | |
| A : Byte; | |
| XX : Integer; | |
| YY : Integer; | |
| Begin | |
| XX:=1;YY:=Y; | |
| Repeat | |
| For t:=1 to 16 do | |
| Begin | |
| A:=ABitMap[XX];Inc(XX); | |
| if (A and $F0)>0 then PutPixel(X+t*2,YY,A div 16); | |
| if (A and $0F)>0 then PutPixel(X+t*2+1,YY,A mod 16); | |
| if XX>512 then Exit; | |
| End; { For t } | |
| Inc(YY); | |
| Until XX=512; | |
| End; | |
| Function LoadIcon(FName : String; Var ABuffer : TIconBuffer) : Boolean; | |
| Var | |
| F : File; | |
| Buffer : PIconBuffer; | |
| AA,BB : Integer; | |
| Begin | |
| {**************************************** | |
| ICON Format | |
| ilk 126 header | |
| 638 byte a pixel color | |
| 1 line of 16 Byte Hi(Byte) and Lo(Byte) 1 pixel | |
| 638 to 126 decrements line (16 byte) DEC(16); | |
| ***************************************} | |
| LoadIcon:=False; | |
| {$I-} | |
| Assign(F,FName); | |
| Reset(F,1); | |
| If IOResult<>0 then Exit; | |
| {$I+} | |
| LoadIcon:=True; | |
| GetMem(Buffer,SizeOf(Buffer)); | |
| AA:=638;BB:=1; | |
| Repeat | |
| Dec(AA,16); | |
| Seek(F,AA); | |
| BlockRead(F,Buffer^[BB],16); | |
| Inc(BB,16); | |
| Until AA=126; | |
| ABuffer:=Buffer^; | |
| FreeMem(Buffer,SizeOf(Buffer)); | |
| End; | |
| procedure DVError(s:string); | |
| begin | |
| closegraph; | |
| writeln(s); | |
| halt; | |
| end; | |
| procedure DVInit; | |
| var gd,gm:integer; | |
| begin | |
| gd:=vga; | |
| gm:=vgahi; | |
| linkdrivers; | |
| initgraph(gd,gm,''); | |
| ShowMouse; | |
| DVTW:=textwidth('X'); | |
| DVTH:=textheight('X'); | |
| outtextxy(0,getmaxy-8,'DreamView '+Version+' - Programmed by Sedat Kapanoglu'); | |
| end; | |
| procedure DVDone; | |
| begin | |
| closegraph; | |
| end; | |
| procedure ShadowBox(R:TRect;shadow:boolean); | |
| var c1,c2:integer; | |
| begin | |
| if shadow then begin | |
| c1:=white;c2:=darkgray; | |
| end else begin | |
| c1:=darkgray;c2:=white; | |
| end; | |
| with r do begin | |
| moveto(b.x,a.y); | |
| setcolor(c1); | |
| lineto(a.x,a.y); | |
| lineto(a.x,b.y); | |
| setcolor(c2); | |
| lineto(b.x,b.y); | |
| lineto(b.x,a.y); | |
| end; | |
| end; | |
| constructor DView.Init; | |
| var oldv:ViewPortType; | |
| begin | |
| new(Layers); | |
| LayerStart:=Layers; | |
| GetViewSettings(OLDV); | |
| with Origin do begin | |
| X:=oldv.x1; | |
| y:=oldv.x2; | |
| end; | |
| end; | |
| function DView.MouseInView:boolean; | |
| begin | |
| GetMouse(Event); | |
| if Bounds.Contains(Event.Where) then | |
| MouseInView:=true else MouseInView:=false; | |
| end; | |
| procedure DView.HandleEvent; | |
| begin | |
| end; | |
| procedure DView.Insert(p:PView); | |
| var newrec:PVRec; | |
| begin | |
| new(newrec); | |
| NewRec^.ChildView:=p; | |
| NewRec^.Next:=LayerStart; | |
| LayerStart:=NewRec; | |
| end; | |
| procedure DView.Delete(p:PView); | |
| var t:PVRec; | |
| b:PVRec; | |
| begin | |
| t:=LayerStart; | |
| while t^.ChildView<>p do begin | |
| b:=t; | |
| t:=t^.Next; | |
| end; | |
| t^.ChildView^.Done; | |
| b^.Next:=t^.Next; | |
| end; | |
| procedure DView.Draw; | |
| begin | |
| end; | |
| destructor DView.Done; | |
| begin | |
| SetFillStyle(solidfill,GetBkColor); | |
| With Bounds do Bar(a.x,a.y,b.x,b.y); | |
| end; | |
| constructor DWindow.Init(ABounds:TRect;AHeader:hdr;ABuffered:boolean); | |
| begin | |
| DView.Init; | |
| Buffered:=ABuffered; | |
| Bounds:=ABounds; | |
| Header:=AHeader; | |
| with Bounds do begin | |
| if Buffered then begin | |
| BufSize:=ImageSize(a.x,a.y,b.x,b.y); | |
| if (BufSize>65535) or (BufSize>MaxAvail) then DVError('Not enough memory'); | |
| GetMem(Buffer,BufSize); | |
| GetImage(a.x,a.y,b.x,b.y,Buffer^); | |
| end; | |
| View.Assign(a.x+2,a.y+18,b.x-2,b.y-2); | |
| end; | |
| end; | |
| procedure DWindow.HandleEvent(var T:TEvent); | |
| var p:PVRec; | |
| begin | |
| if MouseInView then | |
| p:=LayerStart; | |
| while p^.ChildView<>NIL do begin | |
| p^.ChildView^.HandleEvent(Event); | |
| p:=p^.Next; | |
| end; | |
| end; | |
| procedure DWindow.Draw; | |
| var tx,ty,l:integer; | |
| oldv:ViewPortType; | |
| p:PVRec; | |
| begin | |
| HideMouse; | |
| setfillstyle(solidfill,lightgray); | |
| with Bounds do bar(a.x,a.y,b.x,b.y); | |
| setfillstyle(solidfill,black); | |
| with View do bar(a.x,a.y,b.x,b.y); | |
| ShadowBox(Bounds,true); | |
| ShadowBox(View,false); | |
| l:=dvtw*length(header); | |
| tx:=((Bounds.b.x-Bounds.a.x-l) div 2)+Bounds.a.x; | |
| ty:=Bounds.a.x+5; | |
| setcolor(black); | |
| outtextxy(tx,ty,header); | |
| ShowMouse; | |
| GetViewSettings(Oldv); | |
| with View do SetViewPort(a.x+1,a.y+1,b.x-1,b.y-1,true); | |
| p:=LayerStart; | |
| while p^.ChildView<>NIL do begin | |
| p^.ChildView^.Draw; | |
| p:=p^.Next; | |
| end; | |
| with Oldv do SetViewPort(x1,y1,x2,y2,clip); | |
| end; | |
| destructor DWindow.Done; | |
| var p:PVRec; | |
| begin | |
| HideMouse; | |
| p:=LayerStart; | |
| while p^.ChildView<>NIL do begin | |
| p^.ChildView^.Done; | |
| p:=p^.Next; | |
| end; | |
| if Buffered then begin | |
| with Bounds do PutImage(a.x,a.y,buffer^,CopyPut); | |
| freemem(Buffer,BufSize); | |
| end else begin | |
| setfillstyle(solidfill,black); | |
| with Bounds do bar(a.x,a.y,b.x,b.y); | |
| end; | |
| ShowMouse; | |
| end; | |
| constructor DButton.Init(APoint:TPoint;AHeader:hdr); | |
| begin | |
| DView.Init; | |
| with APoint do | |
| Bounds.Assign(X,Y,X+(2+Length(AHeader))*DVTW,Y+DVTH*3); | |
| Header:=AHeader; | |
| end; | |
| procedure DButton.HandleEvent(var T:TEvent); | |
| begin | |
| if MouseInView then begin | |
| GetMouse(T); | |
| if T.Buttons>0 then Pressed:=true else Pressed:=false; | |
| end; | |
| end; | |
| procedure DButton.Draw; | |
| begin | |
| HideMouse; | |
| setfillstyle(solidfill,lightgray); | |
| with Bounds do bar(a.x,a.y,b.x,b.y); | |
| ShadowBox(Bounds,not Pressed); | |
| setcolor(0); | |
| with Bounds do outtextxy(a.x+dvtw,a.y+(b.y-a.y) div 2,header); | |
| ShowMouse; | |
| end; | |
| constructor DInputLine.Init(ABounds:TRect;AMaxLen:Byte); | |
| begin | |
| DView.Init; | |
| Bounds:=ABounds; | |
| Bounds.B.Y:=Bounds.A.Y+th*3; | |
| MaxLen:=AMaxLen; | |
| if MaxLen=0 then MaxLen:=((Bounds.B.Y-Bounds.A.Y) div dvtw)-2; | |
| with Bounds do View.Assign(a.x+dvtw,a.y+dvth,b.x-dvtw,b.y-dvth); | |
| Buffer:=''; | |
| CurPos:=0; | |
| end; | |
| procedure DInputLine.Draw; | |
| var oldv:ViewPortType; | |
| begin | |
| HideMouse; | |
| SetFillStyle(SolidFill,LightGray); | |
| with Bounds do bar(a.x,a.y,b.x,b.y); | |
| ShadowBox(Bounds,false); | |
| GetViewSettings(oldv); | |
| with View do SetViewPort(a.x,a.y,b.x,b.y,true); | |
| with Bounds do OutTextXY(0,0,Buffer+#219); | |
| with Oldv do SetViewPort(x1,y1,x2,y2,clip); | |
| end; | |
| procedure DInputLine.DelChar(x:integer); | |
| begin | |
| SetFillStyle(SolidFill,GetBkColor); | |
| Bar(X,0,X+DVTW,DVTH); | |
| end; | |
| procedure DInputLine.HandleEvent(var T:TEvent); | |
| var oldv:ViewPortType; | |
| begin | |
| GetKeyEvent(T); | |
| if T.What=evNothing then exit; | |
| GetViewSettings(Oldv); | |
| with View do SetViewPort(a.x,a.y,b.x,b.y,true); | |
| if Length(Buffer)<MaxLen then begin | |
| if T.CharCode>#31 then begin | |
| Buffer:=Buffer+T.CharCode; | |
| DelChar(CurPos*DVTW); | |
| OutTextXY(CurPos*DVTW,0,T.CharCode); | |
| inc(CurPos,DVTW); | |
| OutTextXY(CurPos*DVTW,0,Cursor); | |
| end else | |
| case T.CharCode of | |
| #13:Buffer:=Buffer+#13; | |
| #8:if Length(Buffer)>0 then begin | |
| DelChar(CurPos*DVTW); | |
| System.Delete(Buffer,Length(Buffer),1); | |
| Dec(CurPos,DVTW); | |
| OutTextXY(CurPos*DVTW,0,T.CharCode); | |
| end; | |
| end; | |
| end; | |
| end; | |
| constructor DIconButton.Init(s:string;APoint:TPoint); | |
| begin | |
| DView.Init; | |
| if not LoadIcon(s,BitMap) then DVError('Unable to init icons'); | |
| Pressed:=false; | |
| with APoint do Bounds.Assign(x,y,x+32,y+32); | |
| end; | |
| procedure DIconButton.Draw; | |
| begin | |
| MyPutImage(Bounds.a.x,Bounds.a.y,BitMap); | |
| end; | |
| procedure DIconButton.HandleEvent; | |
| begin | |
| if MouseInView then begin | |
| GetMouse(Event); | |
| if Event.Buttons>0 then Pressed:=true else Pressed:=false; | |
| end; | |
| end; | |
| constructor DListWindow.Init(ABounds:TRect;AHeader:hdr;ADescriptor:hdr;AData:PStrRec;AItems:integer); | |
| begin | |
| DWindow.Init(ABounds,AHeader,true); | |
| Descriptor:=ADescriptor; | |
| Data:=AData; | |
| HighLight:=1; | |
| Top:=1; | |
| VisibleItems:=AItems; | |
| end; | |
| procedure DListWindow.Draw; | |
| var oldv:ViewPortType; | |
| begin | |
| DWindow.Draw; | |
| HideMouse; | |
| GetViewSettings(oldv); | |
| with View do SetViewPort(a.x,a.y,b.x,b.y,true); | |
| RefreshList; | |
| with oldv do SetViewPort(x1,y1,x2,y2,clip); | |
| ShowMouse; | |
| end; | |
| {H=72,P=80 ,K=75 ,M=77 } | |
| procedure DListWindow.RefreshList; | |
| var p,LastItem:integer; | |
| pstr:^string; | |
| begin | |
| if Data^.Count-Top>VisibleItems then LastItem:=VisibleItems else LastItem:=Data^.Count-Top; | |
| for p:=Top to Top+LastItem do begin | |
| if p=HighLight then begin | |
| setcolor(Black); | |
| setbkcolor(LightGreen); | |
| end else begin | |
| setcolor(LightGreen); | |
| setbkcolor(Black); | |
| end; | |
| pstr:=Data^.Items^[p]; | |
| outtextxy(0,(p-1)*DVTH,pstr^); {<<<<<<***************} | |
| end; | |
| end; | |
| procedure DListWindow.HandleEvent(var T:TEvent); | |
| var p:integer; | |
| procedure PrepareScroll; | |
| var pll:^string; | |
| begin | |
| SetWriteMode(XorPut); | |
| SetColor(LightGreen); | |
| SetBkColor(LightGreen); | |
| pll:=Data^.Items^[HighLight]; | |
| OutTextXY(0,(Highlight-Top)*dvth,pll^); | |
| end; | |
| begin | |
| DWindow.HandleEvent(T); | |
| GetKeyEvent(T); | |
| case T.ScanCode of | |
| 72:begin | |
| PrepareScroll; | |
| dec(HighLight); | |
| if HighLight<Top then begin | |
| dec(Top); | |
| RefreshList; | |
| end; | |
| end; | |
| 80:begin | |
| PrepareScroll; | |
| Inc(HighLight); | |
| if HighLight>Top+VisibleItems then begin | |
| inc(Top); | |
| RefreshList; | |
| end; | |
| end; | |
| end; | |
| end; | |
| end. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment