MODULE BimboMail; (** AUTHOR "TF"; PURPOSE "Simple Mail Reader"; *) IMPORT Modules, WMGrids, WMStringGrids, MailStorage, WMGraphics, WMMessages, WMStandardComponents, WMComponents, WMEditors, Strings, TextUtilities, Texts, WM := WMWindowManager; CONST TempFilename = "BimboMail.Temp"; TYPE KillerMsg = OBJECT END KillerMsg; Window* = OBJECT (WMComponents.FormWindow) VAR currentMailbox : MailStorage.Storage; messageList : WMStringGrids.StringGrid; messageText : WMEditors.Editor; PROCEDURE CreateForm(): WMComponents.VisualComponent; VAR panel : WMStandardComponents.Panel; toolbar, mailboxSelection, mailContentPanel : WMStandardComponents.Panel; mailboxEntries : WMStringGrids.StringGrid; mailText : WMEditors.Editor; vResizer : WMStandardComponents.Resizer; BEGIN NEW(panel); panel.bounds.SetExtents(800, 700); panel.fillColor.Set(0FFFFFFFFH); panel.takesFocus.Set(TRUE); NEW(toolbar); toolbar.fillColor.Set(000FF00FFH); toolbar.bounds.SetHeight(20); toolbar.alignment.Set(WMComponents.AlignTop); panel.AddContent(toolbar); NEW(mailboxSelection); mailboxSelection.fillColor.Set(0FF0000FFH); mailboxSelection.bounds.SetWidth(64); mailboxSelection.alignment.Set(WMComponents.AlignLeft); panel.AddContent(mailboxSelection); NEW(mailContentPanel); mailContentPanel.fillColor.Set(0FFFFFFFFH); mailContentPanel.bounds.SetHeight(350); mailContentPanel.alignment.Set(WMComponents.AlignBottom); panel.AddContent(mailContentPanel); NEW(mailboxEntries); mailboxEntries.alignment.Set(WMComponents.AlignClient); panel.AddContent(mailboxEntries); messageList := mailboxEntries; NEW(vResizer); vResizer.bounds.SetHeight(5); vResizer.alignment.Set(WMComponents.AlignTop); mailContentPanel.AddContent(vResizer); NEW(mailText); mailText.alignment.Set(WMComponents.AlignClient); mailText.tv.showBorder.Set(TRUE); mailContentPanel.AddContent(mailText); messageText := mailText; mailText.multiLine.Set(TRUE); mailText.readOnly.Set(TRUE); RETURN panel END CreateForm; PROCEDURE SetMailbox(mb : MailStorage.Storage); VAR i : LONGINT; hFrom, hTo, hSubject, hDate : ARRAY 128 OF CHAR; BEGIN currentMailbox := mb; messageList.model.Acquire; messageList.model.SetNofCols(3); messageList.model.SetNofRows(mb.GetCount()); FOR i := 0 TO mb.GetCount() - 1 DO currentMailbox.GetHeader(i, hFrom, hTo, hSubject, hDate); messageList.model.SetCellText(0, i + 1, Strings.NewString(hFrom)); messageList.model.SetTextAlign(0, i + 1, WMGraphics.AlignCenter); messageList.model.SetCellText(1, i + 1, Strings.NewString(hSubject)); messageList.model.SetTextAlign(1, i + 1, WMGraphics.AlignCenter); messageList.model.SetCellText(2, i + 1, Strings.NewString(hDate)); messageList.model.SetTextAlign(2, i + 1, WMGraphics.AlignCenter) END; messageList.model.Release; END SetMailbox; PROCEDURE &New*; VAR vc : WMComponents.VisualComponent; mb : MailStorage.Storage; colWidths : WMGrids.Spacings; i : LONGINT; str : ARRAY 32 OF CHAR; BEGIN IncCount; vc := CreateForm(); Init(vc.bounds.GetWidth(), vc.bounds.GetHeight(), FALSE); SetContent(vc); manager := WM.GetDefaultManager(); manager.Add(100, 100, SELF, {WM.FlagFrame}); SetTitle(Strings.NewString("Bimbo Mail")); messageList.fixedRows.Set(1); NEW(colWidths, 4); colWidths[0] := messageList.bounds.GetWidth() DIV 3; colWidths[1] := 0; colWidths[2] := messageList.bounds.GetWidth() DIV 3; colWidths[3] := messageList.bounds.GetWidth() DIV 3; messageList.SetColSpacings(colWidths); messageList.onClick.Add(MessageClick); messageList.SetSelectionMode(WMGrids.GridSelectSingleRow); messageList.model.Acquire; messageList.model.SetNofCols(3); messageList.model.SetNofRows(2); FOR i := 0 TO 3 - 1 DO GetTitleStr(i, str); messageList.model.SetCellText(i, 0, Strings.NewString(str)); messageList.model.SetTextAlign(i, 0, WMGraphics.AlignCenter) END; messageList.SetColSpacings(colWidths); messageList.model.Release; NEW(mb); mb.Open("MailMessages", ""); SetMailbox(mb); END New; PROCEDURE GetTitleStr(col: LONGINT; VAR x : ARRAY OF CHAR); BEGIN CASE col OF | 0 : COPY("From", x) | 1 : COPY("Subject", x) | 2 : COPY("Date", x) ELSE COPY("", x); END END GetTitleStr; PROCEDURE Close*; BEGIN Close^; DecCount END Close; PROCEDURE Handle*(VAR x: WMMessages.Message); BEGIN IF (x.msgType = WMMessages.MsgExt) & (x.ext # NIL) & (x.ext IS KillerMsg) THEN Close ELSE Handle^(x) END END Handle; (*PROCEDURE DrawCell(canvas : WMGraphics.Canvas; w, h : LONGINT; state : SET; x, y : LONGINT); VAR color: LONGINT; str, hFrom, hTo, hSubject, hDate : ARRAY 128 OF CHAR; BEGIN color := WMGraphics.RGBAToColor(255, 255, 255, 255); IF state * {WMGrids.CellFixed, WMGrids.CellSelected} = {WMGrids.CellFixed, WMGrids.CellSelected} THEN color := WMGraphics.RGBAToColor(0, 128, 255, 255) ELSIF WMGrids.CellFixed IN state THEN color := WMGraphics.RGBAToColor(196, 196, 196, 255) ELSIF WMGrids.CellSelected IN state THEN color := WMGraphics.RGBAToColor(196, 196, 255, 255) ELSIF WMGrids.CellFocused IN state THEN color := WMGraphics.RGBAToColor(255, 255, 196, 255) END; canvas.SetColor(WMGraphics.RGBAToColor(0, 0, 0, 255)); canvas.SetFont(WMBitmapFont.bimbofont); canvas.Fill(WMRectangles.MakeRect(0, 0, w, h), color, WMGraphics.ModeCopy); IF (WMGrids.CellFocused IN state) & ~(WMGrids.CellHighlighted IN state) THEN WMGraphicUtilities.DrawBevel(canvas, WMRectangles.MakeRect(0, 0, w, h), 1, TRUE, WMGraphics.RGBAToColor(0, 0, 0, 196), WMGraphics.ModeSrcOverDst) END; IF y = 0 THEN CASE x OF | 0 : str := "From" | 1 : str := "To" | 2 : str := "Subject" | 3 : str := "Date" ELSE END ELSIF (currentMailbox # NIL) & (y - 1 >= 0) & (y - 1 < currentMailbox.GetCount()) THEN currentMailbox.GetHeader(y - 1, hFrom, hTo, hSubject, hDate); CASE x OF | 0 : COPY(hFrom, str) | 1 : COPY(hTo, str) | 2 : COPY(hSubject, str) | 3 : COPY(hDate, str) ELSE END END; canvas.DrawString(4, h-4, str) END DrawCell; *) PROCEDURE MessageClick(sender, data : ANY); VAR scol, srow, ecol, erow, y, res : LONGINT; text : Texts.Text; BEGIN messageList.GetSelection(scol, srow, ecol, erow); y := srow - 1; IF (currentMailbox # NIL) & (y >= 0) & (y < currentMailbox.GetCount()) THEN IF currentMailbox.ToFile(y, TempFilename) THEN text := messageText.text; text.AcquireWrite; text.Delete(0, text.GetLength()); TextUtilities.LoadOberonText(text, TempFilename, res); text.ReleaseWrite; messageText.tv.firstLine.Set(0); END END END MessageClick; END Window; VAR nofWindows : LONGINT; PROCEDURE Open*; VAR winstance : Window; BEGIN NEW(winstance); END Open; PROCEDURE IncCount; BEGIN {EXCLUSIVE} INC(nofWindows) END IncCount; PROCEDURE DecCount; BEGIN {EXCLUSIVE} DEC(nofWindows) END DecCount; PROCEDURE Cleanup; VAR die : KillerMsg; msg : WMMessages.Message; m : WM.WindowManager; BEGIN {EXCLUSIVE} NEW(die); msg.ext := die; msg.msgType := WMMessages.MsgExt; m := WM.GetDefaultManager(); m.Broadcast(msg); AWAIT(nofWindows = 0) END Cleanup; BEGIN Modules.InstallTermHandler(Cleanup) END BimboMail. BimboMail.Open ~ SystemTools.Free BimboMail MailStorage POP3Client ~ PET.Open MailStorage.Mod ~ PET.Open POP3Client.Mod ~