home *** CD-ROM | disk | FTP | other *** search
- UNIT TrackWin;
-
- {$R TrackWin}
-
- INTERFACE
-
- USES WinTypes, Objects, OWindows, ODialogs;
-
- CONST
- cm_LoadData = 121;
- cm_SaveData = 122;
- wm_UpdateCDTitle : WORD = 0;
- ids_Filter = 111;
- DefExt = '*.REE';
-
- TYPE
- pTrackCollection = ^tTrackCollection;
- tTrackCollection = OBJECT (tStrCollection)
- FUNCTION Compare(Key1, Key2: POINTER): INTEGER; VIRTUAL;
- END;
-
- tTrackXferRec = RECORD
- ListStrings: pTrackCollection;
- ListSelect: INTEGER;
- END;
-
- tTrackData = RECORD
- TrackNo, LenMin, LenSec: WORD;
- TrackName: LONGINT;
- END;
-
- pTrackWindow = ^tTrackWindow;
- tTrackWindow = OBJECT (tWindow)
- aListBox: pListBox;
- aStatic: pStatic;
- TheFont: hFont;
- Xfer: tTrackXferRec;
- CONSTRUCTOR Init (aTitle: pChar);
- DESTRUCTOR Done; VIRTUAL;
- PROCEDURE SetupWindow; VIRTUAL;
- PROCEDURE wmGetMinMaxInfo (VAR Msg: tMessage); VIRTUAL wm_First + wm_GetMinMaxInfo;
- PROCEDURE wmCtlColor (VAR Msg: tMessage); VIRTUAL wm_First + wm_CtlColor;
- PROCEDURE wmSize (VAR Msg: tMessage); VIRTUAL wm_First + wm_Size;
- PROCEDURE LoadData (VAR Msg: tMessage); VIRTUAL cm_First + cm_LoadData;
- PROCEDURE SaveData (VAR Msg: tMessage); VIRTUAL cm_First + cm_SaveData;
- END;
- tFileName = ARRAY [0..255] OF CHAR;
-
- CONST
- TrackWindow: pTrackWindow = NIL;
-
- IMPLEMENTATION
-
- USES WinProcs, Strings, CommDlg, MMSystem, CDAudio;
-
- CONST
- TrackBufLen = 12;
- XSize = 360;
- YSize = 200;
- id_Box = 201;
- id_Static = 202;
- id_ScrollBar = 203;
- StatTitle : pChar = 'Track==Length==Title===========================';
-
- FUNCTION tTrackCollection.Compare(Key1, Key2: POINTER): INTEGER;
- BEGIN
- Compare := -1;
- END;
-
- PROCEDURE WalkOnTheWildSide (VAR ATrackCol: pTrackCollection);
- VAR
- Buffer: ARRAY [0..TrackBufLen] OF CHAR;
- TrackData: tTrackData;
- Count: INTEGER;
- ReturnCode, MSF: LONGINT;
- BEGIN
- FOR Count := 1 TO HowManyTracks DO
- BEGIN
- MSF := GetTrackLen (Count);
- TrackData.TrackNo := Count;
- TrackData.LenMin := mci_MSF_Minute (MSF);
- TrackData.LenSec := mci_MSF_Second (MSF);
- wvSprintF (Buffer, ' %02i %02i:%02i', TrackData);
- ATrackCol^.Insert (StrNew (Buffer));
- END;
- END;
-
- CONSTRUCTOR tTrackWindow.Init (aTitle: pChar);
- BEGIN
- tWindow.Init (NIL, aTitle);
- Attr.w := XSize;
- Attr.h := YSize;
- Attr.Menu := LoadMenu (hInstance, 'TrackMenu');
- aListBox := New (pListBox, Init (@Self, id_Box, 0, 16, XSize, YSize));
- aListBox^.Attr.Style := ((aListBox^.Attr.Style AND NOT ws_Border)
- OR lbs_NoIntegralHeight) AND NOT lbs_Sort;
- EnableKBHandler;
- aStatic := New (pStatic, Init (@Self, id_Static, StatTitle, 0, 0, XSize, 15, StrLen(StatTitle)));
- aStatic^.Attr.Style := aStatic^.Attr.Style OR ss_LeftNoWordWrap;
- Xfer.ListStrings := New (pTrackCollection, Init (20, 2));
- Xfer.ListStrings^.Duplicates := TRUE;
- TransferBuffer := @Xfer;
- END;
-
- DESTRUCTOR tTrackWindow.Done;
- BEGIN
- inherited Done;
- TrackWindow := NIL;
- END;
-
- PROCEDURE tTrackWindow.SetupWindow;
- BEGIN
- tWindow.SetupWindow;
- (* mu▀ ein 13-Punkt Font sein, weil, sollten zusΣtzliche Windows-Fonts geladen sein, *)
- (* nur Winz-Buchstaben zu sehen sind. Funktioniert auch mit geladenem ATM. *)
- TheFont := CreateFont (13, 0, 0, 0, 400, 0, 0, 0, ANSI_CharSet,
- out_Default_Precis, clip_Default_Precis,
- Default_Quality, 0, 'COURIER');
-
- SendMessage (aListBox^.hWindow, wm_SetFont, TheFont, 0);
-
- WalkOnTheWildSide (Xfer.ListStrings);
- aListBox^.Transfer (@Xfer, tf_SetData);
- END;
-
- PROCEDURE tTrackWindow.wmGetMinMaxInfo (VAR Msg: tMessage);
- TYPE
- PInfo= ^TInfo;
- TInfo= ARRAY [0..4] OF tPoint;
- BEGIN
- PInfo(Msg.lParam)^[4].x := XSize;
- END;
-
- PROCEDURE tTrackWindow.wmCtlColor (VAR Msg: tMessage);
- BEGIN
- DefWndProc (Msg);
- IF (Msg.lParamHi = ctlcolor_Static)
- THEN BEGIN
- SetTextColor (Msg.wParam, RGB(150, 0, 0));
- SetBkColor (Msg.wParam, RGB(200, 200, 200));
- END;
- END;
-
- PROCEDURE tTrackWindow.wmSize (VAR Msg: tMessage);
- BEGIN
- tWindow.wmSize (Msg);
- MoveWindow (aListBox^.hWindow, 0, 16, Msg.lParamLo, Msg.lParamHi-16, TRUE);
- END;
-
- FUNCTION Min (a,b: INTEGER): INTEGER;
- BEGIN
- IF (a <= b) THEN Min := a ELSE Min := b;
- END;
-
- PROCEDURE tTrackWindow.LoadData (VAR Msg: tMessage);
- VAR
- OpenFN: TOpenFileName;
- Filter: ARRAY [0..100] OF CHAR;
- TitleLine: STRING[49];
- PTitleLine, PLine, Temp: ARRAY [0..50] OF CHAR;
- FullFileName, FileName: tFileName;
- NewColl, TitleColl: pTrackCollection;
- TrackFile: Text;
- i: INTEGER;
- BEGIN
- StrCopy(FullFileName, '');
-
- FillChar(Filter, SizeOf(Filter), #0); { Set up for double null at end }
- StrCopy(Filter, 'CD Data File (*.REE)');
- StrCopy(@Filter[StrLen(Filter)+1], '*.ree');
-
- FillChar(OpenFN, SizeOf(TOpenFileName), #0);
- WITH OpenFN DO BEGIN
- hInstance := hInstance;
- hwndOwner := hWindow;
- lpstrDefExt := DefExt;
- lpstrFile := FullFileName;
- lpstrFilter := Filter;
- lpstrFileTitle:= FileName;
- Flags := ofn_FileMustExist;
- lStructSize := SizeOf(TOpenFileName);
- nFilterIndex := 1; {Index into Filter String in lpstrFilter}
- nMaxFile := SizeOf(FullFileName);
- END;
- IF GetOpenFileName(OpenFN) THEN BEGIN
- (* open selected file and interpret as track relevant data *)
- NewColl := New (pTrackCollection, Init(20,2));
- Assign (TrackFile, FullFileName);
- Reset (TrackFile);
- ReadLn (TrackFile, TitleLine);
- StrPCopy (PTitleLine, TitleLine);
- SetWindowText (hWindow, PTitleLine);
- (* Send message to main dialog in order to set CD title *)
- SendMessage (Application^.MainWindow^.hWindow, wm_UpdateCDTitle, 0, LONGINT(@PTitleLine));
- (* insert lines from file into a temporary collection *)
- REPEAT
- ReadLn (TrackFile, TitleLine);
- StrPCopy (PTitleLine, TitleLine);
- NewColl^.Insert (StrNew(PTitleLine));
- UNTIL (EoF(TrackFile));
- Close (TrackFile);
- (* create new collection with track/min:sec/title data *)
- TitleColl := New (pTrackCollection, Init(20,2));
- (* compute minimum to avoid collection index out of range *)
- (* if chosen file & CD don't match *)
- (*
- FOR i := 0 TO Min((NewColl^.Count-1), (Xfer.ListStrings^.Count -1)) DO
- *)
- FOR i := 0 TO Xfer.ListStrings^.Count-1 DO
- (* walk thru collections and merge entries *)
- BEGIN
- IF (StrLen (pChar(Xfer.ListStrings^.At(i))) > TrackBufLen) THEN
- BEGIN
- (* there is already title information in the collection *)
- (* so get rid of it *)
- Xfer.ListStrings^.FreeAll;
- (* get new track length information *)
- WalkOnTheWildSide (Xfer.ListStrings);
- END;
- StrCopy (PLine, pChar(Xfer.ListStrings^.At(i)));
- StrCat (PLine, ' ');
- IF (i <= NewColl^.Count-1)
- THEN StrCat (PLine, pChar(NewColl^.At(i)))
- ELSE StrCat (PLine, ' ');
- TitleColl^.Insert (StrNew(PLine));
- END;
- (* Swap collections & ReeDraw! *)
- aListBox^.Transfer (@Xfer, tf_GetData);
- aListBox^.ClearList;
- Dispose (Xfer.ListStrings, Done);
- Dispose (NewColl, Done);
- Xfer.ListStrings := TitleColl;
- aListBox^.Transfer (@Xfer, tf_SetData);
- END;
- END;
-
- PROCEDURE tTrackWindow.SaveData (VAR Msg: tMessage);
- VAR
- OpenFN : TOpenFileName;
- Filter : ARRAY [0..100] OF CHAR;
- FullFileName, FileName: tFileName;
- BEGIN
- StrCopy(FullFileName, '');
-
- FillChar(Filter, SizeOf(Filter), #0); { Set up for double null at end }
- StrCopy(Filter, 'CD Data File (*.REE)');
- StrCopy(@Filter[StrLen(Filter)+1], '*.ree');
-
- FillChar(OpenFN, SizeOf(TOpenFileName), #0);
- WITH OpenFN DO BEGIN
- hInstance := hInstance;
- hwndOwner := hWindow;
- lpstrDefExt := DefExt;
- lpstrFile := FullFileName;
- lpstrFilter := Filter;
- lpstrFileTitle:= FileName;
- Flags := ofn_OverwritePrompt;
- lStructSize := SizeOf(TOpenFileName);
- nFilterIndex := 1; {Index into Filter String in lpstrFilter}
- nMaxFile := SizeOf(FullFileName);
- END;
- IF GetSaveFileName(OpenFN) THEN
- MessageBox (0, FullFileName, 'Hi', mb_OK);
- END;
-
- BEGIN
- wm_UpdateCDTitle := RegisterWindowMessage ('UpdateCDTitle');
- END.
-