MODULE BimboMail;
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 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 ~