IMAPGUI.Mod 93 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873
  1. MODULE IMAPGUI; (** AUTHOR "retmeier"; PURPOSE "A GUI for an IMAP Client"; *)
  2. IMPORT
  3. Streams, Strings, KernelLog, Classes := TFClasses, Kernel, Modules, IMAPClient, IMAPUtilities,
  4. WMComponents, WMStandardComponents, WMWindowManager, WMRectangles, WMEditors, WMDialogs, Raster,
  5. WMGrids, WMStringGrids, WMGraphics, WMPopups, WMTrees, WMMessages, WMRestorable, Texts, UTF8Strings, Files,
  6. XML, XMLScanner, XMLParser, RMSMTP;
  7. CONST
  8. WindowTitle = "MailClient";
  9. CR = 0DX; LF = 0AX;
  10. DEBUG = FALSE;
  11. REFRESHTIME = 1000 * 2; (* ms *)
  12. VAR
  13. nofWindows: LONGINT;
  14. TYPE
  15. String = Strings.String;
  16. KillerMsg = OBJECT
  17. END KillerMsg;
  18. LoadWindow = OBJECT (WMComponents.FormWindow)
  19. VAR
  20. offline: WMStandardComponents.Checkbox;
  21. filename: WMEditors.Editor;
  22. load, cancel: WMStandardComponents.Button;
  23. ready, valid: BOOLEAN;
  24. PROCEDURE &New*;
  25. VAR
  26. vc : WMComponents.VisualComponent;
  27. BEGIN
  28. IncCount();
  29. ready := FALSE;
  30. valid := FALSE;
  31. vc := CreateForm();
  32. Init(vc.bounds.GetWidth(), vc.bounds.GetHeight(), FALSE);
  33. SetContent(vc);
  34. SetTitle(Strings.NewString("Load Account File"));
  35. WMWindowManager.DefaultAddWindow(SELF);
  36. END New;
  37. PROCEDURE CreateForm() : WMComponents.VisualComponent;
  38. VAR
  39. ret, panel : WMStandardComponents.Panel;
  40. label : WMStandardComponents.Label;
  41. BEGIN
  42. NEW(ret); ret.bounds.SetExtents(400, 200); ret.fillColor.Set(LONGINT(0CCCCCCFFH));
  43. NEW(label); label.bounds.SetHeight(25); label.alignment.Set(WMComponents.AlignTop);
  44. label.caption.SetAOC("Please give the path of the file that contains the account data: ");
  45. label.bearing.Set(WMRectangles.MakeRect(10,10,10,10));
  46. ret.AddContent(label);
  47. NEW(filename); filename.bounds.SetHeight(25); filename.alignment.Set(WMComponents.AlignTop);
  48. filename.multiLine.Set(FALSE); filename.fillColor.Set(LONGINT(0FFFFFFFFH)); filename.tv.showBorder.Set(TRUE);
  49. filename.tv.textAlignV.Set(WMGraphics.AlignCenter);
  50. filename.bearing.Set(WMRectangles.MakeRect(10,10,10,10));
  51. ret.AddContent(filename);
  52. NEW(panel);
  53. panel.bounds.SetHeight(20); panel.alignment.Set(WMComponents.AlignTop);
  54. ret.AddContent(panel);
  55. NEW(label); label.bounds.SetWidth(150); label.alignment.Set(WMComponents.AlignLeft);
  56. label.caption.SetAOC("Open the account offline? ");
  57. label.bearing.Set(WMRectangles.MakeRect(10,0,10,0));
  58. panel.AddContent(label);
  59. NEW(offline); offline.bounds.SetWidth(20); offline.alignment.Set(WMComponents.AlignLeft);
  60. panel.AddContent(offline);
  61. NEW(panel);
  62. panel.bounds.SetHeight(20); panel.alignment.Set(WMComponents.AlignBottom);
  63. ret.AddContent(panel);
  64. NEW(load);
  65. load.bounds.SetWidth(100); load.alignment.Set(WMComponents.AlignRight);
  66. load.caption.SetAOC("Load"); load.onClick.Add(LoadHandler);
  67. panel.AddContent(load);
  68. NEW(cancel);
  69. cancel.bounds.SetWidth(100); cancel.alignment.Set(WMComponents.AlignRight);
  70. cancel.caption.SetAOC("Cancel"); cancel.onClick.Add(CancelHandler);
  71. panel.AddContent(cancel);
  72. RETURN ret;
  73. END CreateForm;
  74. PROCEDURE Close*;
  75. BEGIN
  76. Close^();
  77. DecCount();
  78. END Close;
  79. PROCEDURE Handle*(VAR x: WMMessages.Message);
  80. BEGIN
  81. IF (x.msgType = WMMessages.MsgExt) & (x.ext # NIL) & (x.ext IS KillerMsg) THEN
  82. Close();
  83. ELSE
  84. Handle^(x);
  85. END;
  86. END Handle;
  87. PROCEDURE LoadHandler(sender, data: ANY);
  88. BEGIN {EXCLUSIVE}
  89. ready := TRUE;
  90. valid := TRUE;
  91. END LoadHandler;
  92. PROCEDURE GetAnswer(VAR file: String; VAR b: BOOLEAN);
  93. VAR
  94. i: LONGINT;
  95. BEGIN
  96. BEGIN {EXCLUSIVE}
  97. AWAIT(ready);
  98. IF valid THEN
  99. IMAPUtilities.TextToStr(filename.text, file);
  100. ELSE
  101. file := NIL;
  102. END;
  103. i := offline.state.Get();
  104. b := (i = 1);
  105. END;
  106. Close^;
  107. END GetAnswer;
  108. PROCEDURE CancelHandler(sender, data: ANY);
  109. BEGIN
  110. BEGIN {EXCLUSIVE}
  111. ready := TRUE;
  112. END;
  113. Close();
  114. END CancelHandler;
  115. END LoadWindow;
  116. SaveWindow = OBJECT (WMComponents.FormWindow)
  117. VAR
  118. filename: WMEditors.Editor;
  119. save, cancel: WMStandardComponents.Button;
  120. ready, valid: BOOLEAN;
  121. PROCEDURE &New*;
  122. VAR
  123. vc : WMComponents.VisualComponent;
  124. BEGIN
  125. IncCount();
  126. ready := FALSE;
  127. valid := FALSE;
  128. vc := CreateForm();
  129. Init(vc.bounds.GetWidth(), vc.bounds.GetHeight(), FALSE);
  130. SetContent(vc);
  131. SetTitle(Strings.NewString("Save Account As"));
  132. WMWindowManager.DefaultAddWindow(SELF);
  133. END New;
  134. PROCEDURE CreateForm() : WMComponents.VisualComponent;
  135. VAR
  136. ret, panel : WMStandardComponents.Panel;
  137. label : WMStandardComponents.Label;
  138. BEGIN
  139. NEW(ret); ret.bounds.SetExtents(400, 200); ret.fillColor.Set(LONGINT(0CCCCCCFFH));
  140. NEW(label); label.bounds.SetHeight(25); label.alignment.Set(WMComponents.AlignTop);
  141. label.caption.SetAOC("Please give the name of the file that should be saved: ");
  142. label.bearing.Set(WMRectangles.MakeRect(10,10,10,10));
  143. ret.AddContent(label);
  144. NEW(filename); filename.bounds.SetHeight(25); filename.alignment.Set(WMComponents.AlignTop);
  145. filename.multiLine.Set(FALSE); filename.fillColor.Set(LONGINT(0FFFFFFFFH)); filename.tv.showBorder.Set(TRUE);
  146. filename.tv.textAlignV.Set(WMGraphics.AlignCenter);
  147. filename.bearing.Set(WMRectangles.MakeRect(10,10,10,10));
  148. ret.AddContent(filename);
  149. NEW(panel);
  150. panel.bounds.SetHeight(20); panel.alignment.Set(WMComponents.AlignBottom);
  151. ret.AddContent(panel);
  152. NEW(save);
  153. save.bounds.SetWidth(100); save.alignment.Set(WMComponents.AlignRight);
  154. save.caption.SetAOC("Save"); save.onClick.Add(SaveHandler);
  155. panel.AddContent(save);
  156. NEW(cancel);
  157. cancel.bounds.SetWidth(100); cancel.alignment.Set(WMComponents.AlignRight);
  158. cancel.caption.SetAOC("Cancel"); cancel.onClick.Add(CancelHandler);
  159. panel.AddContent(cancel);
  160. RETURN ret;
  161. END CreateForm;
  162. PROCEDURE Close*;
  163. BEGIN
  164. Close^();
  165. DecCount();
  166. END Close;
  167. PROCEDURE Handle*(VAR x: WMMessages.Message);
  168. BEGIN
  169. IF (x.msgType = WMMessages.MsgExt) & (x.ext # NIL) & (x.ext IS KillerMsg) THEN
  170. Close();
  171. ELSE
  172. Handle^(x);
  173. END;
  174. END Handle;
  175. PROCEDURE SaveHandler(sender, data: ANY);
  176. BEGIN {EXCLUSIVE}
  177. ready := TRUE;
  178. valid := TRUE;
  179. END SaveHandler;
  180. PROCEDURE GetAnswer(VAR file: String);
  181. BEGIN
  182. BEGIN {EXCLUSIVE}
  183. AWAIT(ready);
  184. IF valid THEN
  185. IMAPUtilities.TextToStr(filename.text, file);
  186. ELSE
  187. file := NIL;
  188. END;
  189. END;
  190. Close^;
  191. END GetAnswer;
  192. PROCEDURE CancelHandler(sender, data: ANY);
  193. BEGIN
  194. BEGIN {EXCLUSIVE}
  195. ready := TRUE;
  196. END;
  197. Close();
  198. END CancelHandler;
  199. END SaveWindow;
  200. MessageWindow = OBJECT (WMComponents.FormWindow)
  201. VAR
  202. topToolbar, statusbar, headerPanel, messagePanel: WMStandardComponents.Panel;
  203. statusLabel: WMStandardComponents.Label;
  204. send, reply, saveDraft: WMStandardComponents.Button;
  205. from, to, cc, subject, date: WMEditors.Editor;
  206. messageField: WMEditors.Editor;
  207. message: IMAPClient.Message;
  208. window: Window;
  209. folder: IMAPClient.Folder;
  210. PROCEDURE &New*(win: Window);
  211. VAR vc : WMComponents.VisualComponent;
  212. BEGIN
  213. IncCount();
  214. window := win;
  215. IF win # NIL THEN
  216. folder := win.client.currentFolder;
  217. END;
  218. vc := CreateForm();
  219. Init(vc.bounds.GetWidth(), vc.bounds.GetHeight(), FALSE);
  220. SetContent(vc);
  221. SetTitle(Strings.NewString("Message Window"));
  222. from.hScrollbar.visible.Set(FALSE);
  223. to.hScrollbar.visible.Set(FALSE);
  224. cc.hScrollbar.visible.Set(FALSE);
  225. WMWindowManager.DefaultAddWindow(SELF);
  226. END New;
  227. PROCEDURE CreateForm() : WMComponents.VisualComponent;
  228. VAR
  229. panel : WMStandardComponents.Panel;
  230. p: WMStandardComponents.Panel;
  231. label : WMStandardComponents.Label;
  232. BEGIN
  233. NEW(panel); panel.bounds.SetExtents(800, 600); panel.fillColor.Set(LONGINT(0CCCCCCFFH));
  234. (* --- Toolbar --- *)
  235. NEW(topToolbar); topToolbar.bounds.SetHeight(40); topToolbar.alignment.Set(WMComponents.AlignTop);
  236. panel.AddContent(topToolbar);
  237. NEW(send);
  238. send.caption.SetAOC("Send");
  239. send.bounds.SetWidth(120);
  240. send.bearing.Set(WMRectangles.MakeRect(10,10,10,10));
  241. send.alignment.Set(WMComponents.AlignLeft);
  242. send.onClick.Add(ButtonHandler);
  243. topToolbar.AddContent(send);
  244. NEW(reply);
  245. reply.caption.SetAOC("Change Fields to answer");
  246. reply.bounds.SetWidth(140);
  247. reply.bearing.Set(WMRectangles.MakeRect(10,10,10,10));
  248. reply.alignment.Set(WMComponents.AlignLeft);
  249. reply.onClick.Add(ButtonHandler);
  250. topToolbar.AddContent(reply);
  251. NEW(saveDraft);
  252. saveDraft.caption.SetAOC("Save in draft folder");
  253. saveDraft.bounds.SetWidth(120);
  254. saveDraft.bearing.Set(WMRectangles.MakeRect(10,10,10,10));
  255. saveDraft.alignment.Set(WMComponents.AlignLeft);
  256. saveDraft.onClick.Add(ButtonHandler);
  257. topToolbar.AddContent(saveDraft);
  258. (* --- statusbar --- *)
  259. NEW(statusbar); statusbar.bounds.SetHeight(20); statusbar.alignment.Set(WMComponents.AlignBottom);
  260. panel.AddContent(statusbar);
  261. NEW(statusLabel); statusLabel.bounds.SetWidth(800); statusLabel.alignment.Set(WMComponents.AlignLeft);
  262. statusLabel.textColor.Set(0000000FFH);
  263. statusLabel.SetCaption("Status: loading ...");
  264. statusbar.AddContent(statusLabel);
  265. (* --- headerPanel --- *)
  266. NEW(headerPanel); headerPanel.alignment.Set(WMComponents.AlignTop);
  267. headerPanel.bounds.SetHeight(150);
  268. headerPanel.fillColor.Set(LONGINT(0FFFFFFFFH));
  269. panel.AddContent(headerPanel);
  270. (* --- fromPanel --- *)
  271. NEW(p);
  272. p.alignment.Set(WMComponents.AlignTop);
  273. p.bounds.SetHeight(32);
  274. NEW(label);
  275. label.alignment.Set(WMComponents.AlignLeft);
  276. label.bounds.SetWidth(60);
  277. label.SetCaption(" FROM: ");
  278. p.AddContent(label);
  279. NEW(from);
  280. from.alignment.Set(WMComponents.AlignClient);
  281. from.tv.showBorder.Set(TRUE);
  282. from.hScrollbar.visible.Set(FALSE);
  283. p.AddContent(from);
  284. headerPanel.AddContent(p);
  285. (* --- toPanel --- *)
  286. NEW(p);
  287. p.alignment.Set(WMComponents.AlignTop);
  288. p.bounds.SetHeight(32);
  289. NEW(label);
  290. label.alignment.Set(WMComponents.AlignLeft);
  291. label.bounds.SetWidth(60);
  292. label.SetCaption(" TO: ");
  293. p.AddContent(label);
  294. NEW(to);
  295. to.alignment.Set(WMComponents.AlignClient);
  296. to.tv.showBorder.Set(TRUE);
  297. to.hScrollbar.visible.Set(FALSE);
  298. p.AddContent(to);
  299. headerPanel.AddContent(p);
  300. (* --- ccPanel --- *)
  301. NEW(p);
  302. p.alignment.Set(WMComponents.AlignTop);
  303. p.bounds.SetHeight(32);
  304. NEW(label);
  305. label.alignment.Set(WMComponents.AlignLeft);
  306. label.bounds.SetWidth(60);
  307. label.SetCaption(" CC: ");
  308. p.AddContent(label);
  309. NEW(cc);
  310. cc.alignment.Set(WMComponents.AlignClient);
  311. cc.tv.showBorder.Set(TRUE);
  312. cc.hScrollbar.visible.Set(FALSE);
  313. p.AddContent(cc);
  314. headerPanel.AddContent(p);
  315. (* --- subjectPanel --- *)
  316. NEW(p);
  317. p.alignment.Set(WMComponents.AlignTop);
  318. p.bounds.SetHeight(25);
  319. NEW(label);
  320. label.alignment.Set(WMComponents.AlignLeft);
  321. label.bounds.SetWidth(60);
  322. label.SetCaption(" SUBJECT: ");
  323. p.AddContent(label);
  324. NEW(subject);
  325. subject.alignment.Set(WMComponents.AlignClient);
  326. subject.multiLine.Set(FALSE);
  327. subject.tv.textAlignV.Set(WMGraphics.AlignCenter);
  328. subject.tv.showBorder.Set(TRUE);
  329. p.AddContent(subject);
  330. headerPanel.AddContent(p);
  331. (* --- datePanel --- *)
  332. NEW(p);
  333. p.alignment.Set(WMComponents.AlignTop);
  334. p.bounds.SetHeight(25);
  335. NEW(label);
  336. label.alignment.Set(WMComponents.AlignLeft);
  337. label.bounds.SetWidth(60);
  338. label.SetCaption(" DATE: ");
  339. p.AddContent(label);
  340. NEW(date);
  341. date.alignment.Set(WMComponents.AlignClient);
  342. date.multiLine.Set(FALSE);
  343. date.tv.textAlignV.Set(WMGraphics.AlignCenter);
  344. date.tv.showBorder.Set(TRUE);
  345. p.AddContent(date);
  346. headerPanel.AddContent(p);
  347. (* --- messagePanel --- *)
  348. NEW(messagePanel); messagePanel.alignment.Set(WMComponents.AlignClient);
  349. NEW(messageField);
  350. messageField.alignment.Set(WMComponents.AlignClient);
  351. messageField.tv.showBorder.Set(TRUE);
  352. messageField.SetAsString("");
  353. messagePanel.AddContent(messageField);
  354. messagePanel.fillColor.Set(LONGINT(0FFFFFFFFH));
  355. messageField.hScrollbar.visible.Set(FALSE);
  356. panel.AddContent(messagePanel);
  357. RETURN panel;
  358. END CreateForm;
  359. PROCEDURE Close*;
  360. BEGIN
  361. Close^();
  362. DecCount();
  363. END Close;
  364. PROCEDURE Handle*(VAR x: WMMessages.Message);
  365. BEGIN
  366. IF (x.msgType = WMMessages.MsgExt) & (x.ext # NIL) & (x.ext IS KillerMsg) THEN
  367. Close();
  368. ELSE
  369. Handle^(x);
  370. END;
  371. END Handle;
  372. PROCEDURE ButtonHandler*(sender, data: ANY);
  373. BEGIN
  374. IF sender = send THEN
  375. Send();
  376. ELSIF sender = reply THEN
  377. Reply();
  378. ELSIF sender = saveDraft THEN
  379. SaveDraft();
  380. ELSE
  381. OutputError("An Unknown Button was pressed");
  382. END;
  383. END ButtonHandler;
  384. PROCEDURE Reply;
  385. VAR
  386. string: Strings.String;
  387. buffer: Strings.Buffer;
  388. w: Streams.Writer;
  389. r: LONGINT;
  390. header: IMAPClient.HeaderElement;
  391. BEGIN
  392. header := message.header;
  393. IMAPUtilities.TextToStr(subject.text, string);
  394. NEW(buffer, 16);
  395. w := buffer.GetWriter();
  396. w.String("Re: ");
  397. w.String(string^);
  398. string := buffer.GetString();
  399. IMAPUtilities.SetEditorText(subject, string);
  400. IF header.from # NIL THEN
  401. IMAPUtilities.AddressesToString(header.from, string);
  402. IMAPUtilities.SetEditorText(to, string);
  403. ELSE
  404. string := Strings.NewString("");
  405. END;
  406. NEW(buffer, 16);
  407. w := buffer.GetWriter();
  408. w.Char(CR); w.Char(LF); w.Char(CR); w.Char(LF);
  409. w.String(string^);
  410. w.String(" wrote:"); w.Char(CR); w.Char(LF); w.Char(CR); w.Char(LF);
  411. IMAPUtilities.TextToStr(messageField.text, string);
  412. w.String(string^);
  413. string := buffer.GetString();
  414. IMAPUtilities.SetEditorText(messageField, string);
  415. IF window # NIL THEN
  416. string := Strings.NewString(window.client.preferences.From^);
  417. IMAPUtilities.SetEditorText(from, string);
  418. IF window.client.currentFolder # folder THEN
  419. buffer.Clear();
  420. w.String("The current Folder of your Mail Client is not equal to the Folder this Message is stored in. ");
  421. w.String("So the Answered Flag will not be updated. ");
  422. w.String("If you want the Answered Flag to be updated change to the Folder this Message is stored in and click Yes. ");
  423. w.String("Otherwise click No.");
  424. string := buffer.GetString();
  425. r := WMDialogs.ResYes;
  426. WHILE (r = WMDialogs.ResYes) & (window.client.currentFolder # folder) DO
  427. r := WMDialogs.Confirmation(WindowTitle,string^);
  428. END;
  429. IF (r = WMDialogs.ResYes) & (window.client.currentFolder = folder) THEN
  430. r := window.client.SetAnsweredFlag(message);
  431. END;
  432. ELSE
  433. r := window.client.SetAnsweredFlag(message);
  434. END;
  435. END;
  436. END Reply;
  437. PROCEDURE Send;
  438. VAR
  439. server, thisHost: ARRAY 1000 OF CHAR;
  440. preferences: IMAPClient.AccountPreferences;
  441. r: LONGINT;
  442. msg, caption: String;
  443. buttons: SET;
  444. header: IMAPClient.HeaderElement;
  445. newMessage: IMAPClient.Message;
  446. BEGIN
  447. NEW(header);
  448. NEW(newMessage);
  449. newMessage.header := header;
  450. message := newMessage;
  451. BuildMessage();
  452. IF window # NIL THEN
  453. preferences := window.client.preferences;
  454. IMAPUtilities.StringCopy(preferences.SMTPServer^, 0, IMAPUtilities.StringLength(preferences.SMTPServer^), server);
  455. IMAPUtilities.StringCopy(preferences.SMTPThisHost^, 0, IMAPUtilities.StringLength(preferences.SMTPThisHost^), thisHost);
  456. ELSE
  457. server := "";
  458. thisHost := "";
  459. END;
  460. statusLabel.caption.SetAOC("Status: Preparing...");
  461. IF WMDialogs.QueryString("Enter SMTP-Server:", server) = WMDialogs.ResOk THEN
  462. IF WMDialogs.QueryString("Enter Name of this host", thisHost) = WMDialogs.ResOk THEN
  463. statusLabel.caption.SetAOC("Status: Sending...");
  464. (* r := RMSMTP.SendMessage(message, server, thisHost); *)
  465. statusLabel.caption.SetAOC("Status: Finished");
  466. IF r = RMSMTP.OK THEN
  467. buttons := {WMDialogs.ResYes, WMDialogs.ResNo};
  468. caption := Strings.NewString("Send was successful");
  469. msg := Strings.NewString("Send was successful. Do you want to close the MessageWindow now?");
  470. IF window # NIL THEN
  471. window.client.abort := TRUE;
  472. r := window.client.SaveSentMessage(message);
  473. window.client.abort := FALSE;
  474. END
  475. ELSE
  476. buttons := {WMDialogs.ResOk};
  477. caption := Strings.NewString("Send was NOT successful");
  478. msg := Strings.NewString("Send was NOT successful.");
  479. END;
  480. r := WMDialogs.Message(WMDialogs.TInformation, caption^, msg^, buttons);
  481. IF r = WMDialogs.ResYes THEN
  482. Close^;
  483. END;
  484. END;
  485. END;
  486. statusLabel.caption.SetAOC("Status: Finished");
  487. END Send;
  488. PROCEDURE SaveDraft;
  489. VAR
  490. path: String;
  491. r: LONGINT;
  492. BEGIN
  493. path := window.client.preferences.DraftFolder;
  494. IF path^ = "" THEN
  495. OutputError("No Draft Folder specified in Preferences");
  496. RETURN;
  497. END;
  498. BuildMessage();
  499. r := window.client.AppendMessage(message, path);
  500. END SaveDraft;
  501. (* Reads the input fields and stores them in the message object *)
  502. PROCEDURE BuildMessage;
  503. VAR
  504. string: String;
  505. addresses: Classes.List;
  506. BEGIN
  507. NEW(message);
  508. NEW(message.header);
  509. IMAPUtilities.TextToStr(from.text, string);
  510. IF Strings.Length(string^) > 0 THEN
  511. IMAPUtilities.ParseAddresses(string, addresses);
  512. message.header.from := addresses;
  513. END;
  514. IMAPUtilities.TextToStr(to.text, string);
  515. IF Strings.Length(string^) > 0 THEN
  516. IMAPUtilities.ParseAddresses(string, addresses);
  517. message.header.to := addresses;
  518. END;
  519. IMAPUtilities.TextToStr(cc.text, string);
  520. IF Strings.Length(string^) > 0 THEN
  521. IMAPUtilities.ParseAddresses(string, addresses);
  522. message.header.cc := addresses;
  523. END;
  524. IMAPUtilities.TextToStr(subject.text, string);
  525. message.header.subject := Strings.NewString(string^);
  526. message.header.date := IMAPUtilities.getRFC822Date();
  527. IMAPUtilities.TextToStr(messageField.text, string);
  528. message.message := string;
  529. END BuildMessage;
  530. PROCEDURE NewMessage*;
  531. VAR
  532. header: IMAPClient.HeaderElement;
  533. string: String;
  534. BEGIN
  535. NEW(message);
  536. NEW(header);
  537. message.header := header;
  538. IF window # NIL THEN
  539. string := Strings.NewString(window.client.preferences.From^);
  540. IMAPUtilities.SetEditorText(from, string);
  541. END;
  542. statusLabel.caption.SetAOC("Status: Ready");
  543. from.hScrollbar.visible.Set(FALSE);
  544. to.hScrollbar.visible.Set(FALSE);
  545. cc.hScrollbar.visible.Set(FALSE);
  546. messageField.hScrollbar.visible.Set(FALSE);
  547. END NewMessage;
  548. PROCEDURE DisplayMessage*(message: IMAPClient.Message);
  549. VAR
  550. string, string2: String;
  551. header: IMAPClient.HeaderElement;
  552. i: LONGINT;
  553. text: Texts.Text;
  554. BEGIN
  555. SELF.message := message;
  556. from.hScrollbar.visible.Set(FALSE);
  557. to.hScrollbar.visible.Set(FALSE);
  558. cc.hScrollbar.visible.Set(FALSE);
  559. messageField.hScrollbar.visible.Set(FALSE);
  560. header := message.header;
  561. IF header.from # NIL THEN
  562. IMAPUtilities.AddressesToString(header.from, string);
  563. IMAPUtilities.replaceEncodedHeaderWord(string^);
  564. IMAPUtilities.SetEditorText(from, string);
  565. END;
  566. IF header.to # NIL THEN
  567. IMAPUtilities.AddressesToString(header.to, string);
  568. IMAPUtilities.replaceEncodedHeaderWord(string^);
  569. IMAPUtilities.SetEditorText(to, string);
  570. END;
  571. IF header.cc # NIL THEN
  572. IMAPUtilities.AddressesToString(header.cc, string);
  573. IMAPUtilities.replaceEncodedHeaderWord(string^);
  574. IMAPUtilities.SetEditorText(cc, string);
  575. END;
  576. IF header.subject # NIL THEN
  577. string := IMAPUtilities.NewString(header.subject^);
  578. IMAPUtilities.replaceEncodedHeaderWord(string^);
  579. IMAPUtilities.SetEditorText(subject, string);
  580. END;
  581. IF header.date # NIL THEN
  582. string := IMAPUtilities.NewString(header.date^);
  583. IMAPUtilities.replaceEncodedHeaderWord(string^);
  584. IMAPUtilities.SetEditorText(date, string);
  585. END;
  586. IF message.bodystructure # NIL THEN
  587. Strings.UpperCase(message.bodystructure.type);
  588. Strings.UpperCase(message.bodystructure.subtype);
  589. Strings.UpperCase(message.bodystructure.encoding);
  590. Strings.UpperCase(message.bodystructure.charset);
  591. IF DEBUG THEN
  592. KernelLog.String("Type: "); KernelLog.String(message.bodystructure.type); KernelLog.Ln();
  593. KernelLog.String("SubType: "); KernelLog.String(message.bodystructure.subtype); KernelLog.Ln();
  594. KernelLog.String("Encoding: "); KernelLog.String(message.bodystructure.encoding); KernelLog.Ln();
  595. KernelLog.String("Charset: "); KernelLog.String(message.bodystructure.charset); KernelLog.Ln();
  596. END;
  597. IF (message.bodystructure.type = "TEXT") & (message.bodystructure.subtype = "PLAIN") THEN
  598. IF message.message # NIL THEN
  599. IF message.bodystructure.encoding = "BASE64" THEN
  600. (* decode base64 *)
  601. string := IMAPUtilities.decodeBase64(message.message^);
  602. ELSIF message.bodystructure.encoding = "QUOTED-PRINTABLE" THEN
  603. (* decode quoted-printable *)
  604. string := IMAPUtilities.decodeQuotedPrintable(message.message^);
  605. ELSE
  606. (* don't have to decode *)
  607. string := Strings.NewString(message.message^);
  608. END;
  609. (* transform message to the right charset *)
  610. NEW(text);
  611. IF message.bodystructure.charset = "UTF-8" THEN
  612. IMAPUtilities.StrToText(text, 0, string^);
  613. ELSIF message.bodystructure.charset = "ISO-8859-1" THEN
  614. i := IMAPUtilities.StringLength(string^);
  615. NEW(string2, 6*i + 1);
  616. UTF8Strings.ASCIItoUTF8(string^, string2^);
  617. IMAPUtilities.StrToText(text, 0, string2^);
  618. ELSE (* assume US-ASCII *)
  619. i := IMAPUtilities.StringLength(string^);
  620. NEW(string2, 6*i + 1);
  621. UTF8Strings.ASCIItoUTF8(string^, string2^);
  622. IMAPUtilities.StrToText(text, 0, string2^);
  623. END;
  624. messageField.SetText(text);
  625. statusLabel.SetCaption("Status: Finished");
  626. ELSE
  627. messageField.SetAsString("Message can not be loaded!");
  628. statusLabel.SetCaption("Finished");
  629. END;
  630. ELSE
  631. NEW(text);
  632. IMAPUtilities.StrToText(text, 0, message.message^);
  633. messageField.SetText(text);
  634. statusLabel.SetCaption("Message is not of type TEXT/PLAIN");
  635. END;
  636. ELSE
  637. IF message.message = NIL THEN
  638. OutputError("The body of this message is not available. Maybe your are offline and don't have the body in your local storage");
  639. ELSE
  640. (* assume TEXT/PLAIN, US-ASSCII, no Encoding *)
  641. NEW(text);
  642. IMAPUtilities.StrToText(text, 0, message.message^);
  643. messageField.SetText(text);
  644. statusLabel.SetCaption("The Bodystructure for this message is not available. TEXT/PLAIN is assumed.");
  645. END;
  646. END;
  647. from.hScrollbar.visible.Set(FALSE);
  648. to.hScrollbar.visible.Set(FALSE);
  649. cc.hScrollbar.visible.Set(FALSE);
  650. END DisplayMessage;
  651. END MessageWindow;
  652. SearchWindow = OBJECT (WMComponents.FormWindow)
  653. VAR
  654. answered, unanswered, deleted, undeleted, draft, undraft, flagged, unflagged, seen, unseen, recent, old: WMStandardComponents.Checkbox;
  655. subject, text, from, minSize, maxSize: WMEditors.Editor;
  656. search, cancel: WMStandardComponents.Button;
  657. before, on, after: WMStandardComponents.Checkbox;
  658. day, month, year: WMEditors.Editor;
  659. utf8: WMStandardComponents.Checkbox;
  660. status: WMStandardComponents.Label;
  661. w: Window;
  662. PROCEDURE &New*(win: Window);
  663. VAR
  664. vc : WMComponents.VisualComponent;
  665. BEGIN
  666. IncCount();
  667. w := win;
  668. vc := CreateForm();
  669. Init(vc.bounds.GetWidth(), vc.bounds.GetHeight(), FALSE);
  670. SetContent(vc);
  671. SetTitle(Strings.NewString("Search Window"));
  672. WMWindowManager.DefaultAddWindow(SELF);
  673. END New;
  674. PROCEDURE CreateForm() : WMComponents.VisualComponent;
  675. VAR
  676. panel : WMStandardComponents.Panel;
  677. label: WMStandardComponents.Label;
  678. p: WMStandardComponents.Panel;
  679. BEGIN
  680. NEW(panel); panel.bounds.SetExtents(600, 400); panel.fillColor.Set(LONGINT(0CCCCCCFFH));
  681. (* --- flags --- *)
  682. NEW(p);
  683. p.bounds.SetHeight(20); p.alignment.Set(WMComponents.AlignTop);
  684. p.bearing.Set(WMRectangles.MakeRect(5,2,5,2));
  685. panel.AddContent(p);
  686. NEW(label); label.bounds.SetWidth(100); label.alignment.Set(WMComponents.AlignLeft);
  687. label.caption.SetAOC("Answered: ");
  688. p.AddContent(label);
  689. NEW(answered); answered.bounds.SetWidth(20); answered.alignment.Set(WMComponents.AlignLeft);
  690. p.AddContent(answered);
  691. NEW(label); label.bounds.SetWidth(50); label.alignment.Set(WMComponents.AlignLeft);
  692. p.AddContent(label);
  693. NEW(label); label.bounds.SetWidth(100); label.alignment.Set(WMComponents.AlignLeft);
  694. label.caption.SetAOC("Unanswered: ");
  695. p.AddContent(label);
  696. NEW(unanswered); unanswered.bounds.SetWidth(20); unanswered.alignment.Set(WMComponents.AlignLeft);
  697. p.AddContent(unanswered);
  698. NEW(p);
  699. p.bounds.SetHeight(20); p.alignment.Set(WMComponents.AlignTop);
  700. p.bearing.Set(WMRectangles.MakeRect(5,2,5,2));
  701. panel.AddContent(p);
  702. NEW(label); label.bounds.SetWidth(100); label.alignment.Set(WMComponents.AlignLeft);
  703. label.caption.SetAOC("Deleted: ");
  704. p.AddContent(label);
  705. NEW(deleted); deleted.bounds.SetWidth(20); deleted.alignment.Set(WMComponents.AlignLeft);
  706. p.AddContent(deleted);
  707. NEW(label); label.bounds.SetWidth(50); label.alignment.Set(WMComponents.AlignLeft);
  708. p.AddContent(label);
  709. NEW(label); label.bounds.SetWidth(100); label.alignment.Set(WMComponents.AlignLeft);
  710. label.caption.SetAOC("Undeleted: ");
  711. p.AddContent(label);
  712. NEW(undeleted); undeleted.bounds.SetWidth(20); undeleted.alignment.Set(WMComponents.AlignLeft);
  713. p.AddContent(undeleted);
  714. NEW(p);
  715. p.bounds.SetHeight(20); p.alignment.Set(WMComponents.AlignTop);
  716. p.bearing.Set(WMRectangles.MakeRect(5,2,5,2));
  717. panel.AddContent(p);
  718. NEW(label); label.bounds.SetWidth(100); label.alignment.Set(WMComponents.AlignLeft);
  719. label.caption.SetAOC("Draft: ");
  720. p.AddContent(label);
  721. NEW(draft); draft.bounds.SetWidth(20); draft.alignment.Set(WMComponents.AlignLeft);
  722. p.AddContent(draft);
  723. NEW(label); label.bounds.SetWidth(50); label.alignment.Set(WMComponents.AlignLeft);
  724. p.AddContent(label);
  725. NEW(label); label.bounds.SetWidth(100); label.alignment.Set(WMComponents.AlignLeft);
  726. label.caption.SetAOC("Undraft: ");
  727. p.AddContent(label);
  728. NEW(undraft); undraft.bounds.SetWidth(20); undraft.alignment.Set(WMComponents.AlignLeft);
  729. p.AddContent(undraft);
  730. NEW(p);
  731. p.bounds.SetHeight(20); p.alignment.Set(WMComponents.AlignTop);
  732. p.bearing.Set(WMRectangles.MakeRect(5,2,5,2));
  733. panel.AddContent(p);
  734. NEW(label); label.bounds.SetWidth(100); label.alignment.Set(WMComponents.AlignLeft);
  735. label.caption.SetAOC("Flagged: ");
  736. p.AddContent(label);
  737. NEW(flagged); flagged.bounds.SetWidth(20); flagged.alignment.Set(WMComponents.AlignLeft);
  738. p.AddContent(flagged);
  739. NEW(label); label.bounds.SetWidth(50); label.alignment.Set(WMComponents.AlignLeft);
  740. p.AddContent(label);
  741. NEW(label); label.bounds.SetWidth(100); label.alignment.Set(WMComponents.AlignLeft);
  742. label.caption.SetAOC("Unflagged: ");
  743. p.AddContent(label);
  744. NEW(unflagged); unflagged.bounds.SetWidth(20); unflagged.alignment.Set(WMComponents.AlignLeft);
  745. p.AddContent(unflagged);
  746. NEW(p);
  747. p.bounds.SetHeight(20); p.alignment.Set(WMComponents.AlignTop);
  748. p.bearing.Set(WMRectangles.MakeRect(5,2,5,2));
  749. panel.AddContent(p);
  750. NEW(label); label.bounds.SetWidth(100); label.alignment.Set(WMComponents.AlignLeft);
  751. label.caption.SetAOC("Seen: ");
  752. p.AddContent(label);
  753. NEW(seen); seen.bounds.SetWidth(20); seen.alignment.Set(WMComponents.AlignLeft);
  754. p.AddContent(seen);
  755. NEW(label); label.bounds.SetWidth(50); label.alignment.Set(WMComponents.AlignLeft);
  756. p.AddContent(label);
  757. NEW(label); label.bounds.SetWidth(100); label.alignment.Set(WMComponents.AlignLeft);
  758. label.caption.SetAOC("Unseen: ");
  759. p.AddContent(label);
  760. NEW(unseen); unseen.bounds.SetWidth(20); unseen.alignment.Set(WMComponents.AlignLeft);
  761. p.AddContent(unseen);
  762. NEW(p);
  763. p.bounds.SetHeight(20); p.alignment.Set(WMComponents.AlignTop);
  764. p.bearing.Set(WMRectangles.MakeRect(5,2,5,2));
  765. panel.AddContent(p);
  766. NEW(label); label.bounds.SetWidth(100); label.alignment.Set(WMComponents.AlignLeft);
  767. label.caption.SetAOC("Recent: ");
  768. p.AddContent(label);
  769. NEW(recent); recent.bounds.SetWidth(20); recent.alignment.Set(WMComponents.AlignLeft);
  770. p.AddContent(recent);
  771. NEW(label); label.bounds.SetWidth(50); label.alignment.Set(WMComponents.AlignLeft);
  772. p.AddContent(label);
  773. NEW(label); label.bounds.SetWidth(100); label.alignment.Set(WMComponents.AlignLeft);
  774. label.caption.SetAOC("Old: ");
  775. p.AddContent(label);
  776. NEW(old); old.bounds.SetWidth(20); old.alignment.Set(WMComponents.AlignLeft);
  777. p.AddContent(old);
  778. (* --- rest --- *)
  779. NEW(p);
  780. p.bounds.SetHeight(25); p.alignment.Set(WMComponents.AlignTop);
  781. p.bearing.Set(WMRectangles.MakeRect(5,2,5,2));
  782. panel.AddContent(p);
  783. NEW(label); label.bounds.SetWidth(100); label.alignment.Set(WMComponents.AlignLeft);
  784. label.caption.SetAOC("Subject: ");
  785. p.AddContent(label);
  786. NEW(subject); subject.bounds.SetWidth(300); subject.alignment.Set(WMComponents.AlignClient);
  787. subject.multiLine.Set(FALSE); subject.fillColor.Set(LONGINT(0FFFFFFFFH)); subject.tv.showBorder.Set(TRUE);
  788. subject.tv.textAlignV.Set(WMGraphics.AlignCenter);
  789. p.AddContent(subject);
  790. NEW(p);
  791. p.bounds.SetHeight(25); p.alignment.Set(WMComponents.AlignTop);
  792. p.bearing.Set(WMRectangles.MakeRect(5,2,5,2));
  793. panel.AddContent(p);
  794. NEW(label); label.bounds.SetWidth(100); label.alignment.Set(WMComponents.AlignLeft);
  795. label.caption.SetAOC("From: ");
  796. p.AddContent(label);
  797. NEW(from); from.bounds.SetWidth(300); from.alignment.Set(WMComponents.AlignClient);
  798. from.multiLine.Set(FALSE); from.fillColor.Set(LONGINT(0FFFFFFFFH)); from.tv.showBorder.Set(TRUE);
  799. from.tv.textAlignV.Set(WMGraphics.AlignCenter);
  800. p.AddContent(from);
  801. NEW(p);
  802. p.bounds.SetHeight(25); p.alignment.Set(WMComponents.AlignTop);
  803. p.bearing.Set(WMRectangles.MakeRect(5,2,5,2));
  804. panel.AddContent(p);
  805. NEW(label); label.bounds.SetWidth(100); label.alignment.Set(WMComponents.AlignLeft);
  806. label.caption.SetAOC("Body-Text: ");
  807. p.AddContent(label);
  808. NEW(text); text.bounds.SetWidth(300); text.alignment.Set(WMComponents.AlignClient);
  809. text.multiLine.Set(FALSE); text.fillColor.Set(LONGINT(0FFFFFFFFH)); text.tv.showBorder.Set(TRUE);
  810. text.tv.textAlignV.Set(WMGraphics.AlignCenter);
  811. p.AddContent(text);
  812. NEW(p);
  813. p.bounds.SetHeight(20); p.alignment.Set(WMComponents.AlignTop);
  814. p.bearing.Set(WMRectangles.MakeRect(5,2,5,2));
  815. panel.AddContent(p);
  816. NEW(label); label.bounds.SetWidth(100); label.alignment.Set(WMComponents.AlignLeft);
  817. label.caption.SetAOC("Min Size: ");
  818. p.AddContent(label);
  819. NEW(minSize); minSize.bounds.SetWidth(100); minSize.alignment.Set(WMComponents.AlignLeft);
  820. minSize.multiLine.Set(FALSE); minSize.fillColor.Set(LONGINT(0FFFFFFFFH)); minSize.tv.showBorder.Set(TRUE);
  821. minSize.tv.textAlignV.Set(WMGraphics.AlignCenter);
  822. p.AddContent(minSize);
  823. NEW(label); label.bounds.SetWidth(50); label.alignment.Set(WMComponents.AlignLeft);
  824. label.caption.SetAOC(" ");
  825. p.AddContent(label);
  826. NEW(label); label.bounds.SetWidth(100); label.alignment.Set(WMComponents.AlignLeft);
  827. label.caption.SetAOC("Max Size: ");
  828. p.AddContent(label);
  829. NEW(maxSize); maxSize.bounds.SetWidth(100); maxSize.alignment.Set(WMComponents.AlignLeft);
  830. maxSize.multiLine.Set(FALSE); maxSize.fillColor.Set(LONGINT(0FFFFFFFFH)); maxSize.tv.showBorder.Set(TRUE);
  831. maxSize.tv.textAlignV.Set(WMGraphics.AlignCenter);
  832. p.AddContent(maxSize);
  833. NEW(p);
  834. p.bounds.SetHeight(15); p.alignment.Set(WMComponents.AlignTop);
  835. p.bearing.Set(WMRectangles.MakeRect(5,2,5,2));
  836. panel.AddContent(p);
  837. NEW(p);
  838. p.bounds.SetHeight(20); p.alignment.Set(WMComponents.AlignTop);
  839. p.bearing.Set(WMRectangles.MakeRect(5,2,5,2));
  840. panel.AddContent(p);
  841. NEW(label); label.bounds.SetWidth(100); label.alignment.Set(WMComponents.AlignLeft);
  842. label.caption.SetAOC("Before: ");
  843. p.AddContent(label);
  844. NEW(before); before.bounds.SetWidth(20); before.alignment.Set(WMComponents.AlignLeft);
  845. p.AddContent(before);
  846. NEW(p);
  847. p.bounds.SetHeight(20); p.alignment.Set(WMComponents.AlignTop);
  848. p.bearing.Set(WMRectangles.MakeRect(5,2,5,2));
  849. panel.AddContent(p);
  850. NEW(label); label.bounds.SetWidth(100); label.alignment.Set(WMComponents.AlignLeft);
  851. label.caption.SetAOC("On: ");
  852. p.AddContent(label);
  853. NEW(on); on.bounds.SetWidth(20); on.alignment.Set(WMComponents.AlignLeft);
  854. p.AddContent(on);
  855. NEW(label); label.bounds.SetWidth(50); label.alignment.Set(WMComponents.AlignLeft);
  856. label.caption.SetAOC(" ");
  857. p.AddContent(label);
  858. NEW(label); label.bounds.SetWidth(50); label.alignment.Set(WMComponents.AlignLeft);
  859. label.caption.SetAOC("Date: ");
  860. p.AddContent(label);
  861. NEW(label); label.bounds.SetWidth(50); label.alignment.Set(WMComponents.AlignLeft);
  862. label.caption.SetAOC("Day: ");
  863. p.AddContent(label);
  864. NEW(day); day.bounds.SetWidth(50); day.alignment.Set(WMComponents.AlignLeft);
  865. day.multiLine.Set(FALSE); day.fillColor.Set(LONGINT(0FFFFFFFFH)); day.tv.showBorder.Set(TRUE);
  866. day.tv.textAlignV.Set(WMGraphics.AlignCenter);
  867. p.AddContent(day);
  868. NEW(label); label.bounds.SetWidth(50); label.alignment.Set(WMComponents.AlignLeft);
  869. label.caption.SetAOC("Month: ");
  870. p.AddContent(label);
  871. NEW(month); month.bounds.SetWidth(50); month.alignment.Set(WMComponents.AlignLeft);
  872. month.multiLine.Set(FALSE); month.fillColor.Set(LONGINT(0FFFFFFFFH)); month.tv.showBorder.Set(TRUE);
  873. month.tv.textAlignV.Set(WMGraphics.AlignCenter);
  874. p.AddContent(month);
  875. NEW(label); label.bounds.SetWidth(50); label.alignment.Set(WMComponents.AlignLeft);
  876. label.caption.SetAOC("Year: ");
  877. p.AddContent(label);
  878. NEW(year); year.bounds.SetWidth(50); year.alignment.Set(WMComponents.AlignLeft);
  879. year.multiLine.Set(FALSE); year.fillColor.Set(LONGINT(0FFFFFFFFH)); year.tv.showBorder.Set(TRUE);
  880. year.tv.textAlignV.Set(WMGraphics.AlignCenter);
  881. p.AddContent(year);
  882. NEW(p);
  883. p.bounds.SetHeight(20); p.alignment.Set(WMComponents.AlignTop);
  884. p.bearing.Set(WMRectangles.MakeRect(5,2,5,2));
  885. panel.AddContent(p);
  886. NEW(label); label.bounds.SetWidth(100); label.alignment.Set(WMComponents.AlignLeft);
  887. label.caption.SetAOC("After: ");
  888. p.AddContent(label);
  889. NEW(after); after.bounds.SetWidth(20); after.alignment.Set(WMComponents.AlignLeft);
  890. p.AddContent(after);
  891. NEW(p);
  892. p.bounds.SetHeight(20); p.alignment.Set(WMComponents.AlignTop);
  893. p.bearing.Set(WMRectangles.MakeRect(5,2,5,2));
  894. panel.AddContent(p);
  895. NEW(label); label.bounds.SetWidth(200); label.alignment.Set(WMComponents.AlignLeft);
  896. label.caption.SetAOC("Try UTF-8 charset for search strings: ");
  897. p.AddContent(label);
  898. NEW(utf8); utf8.bounds.SetWidth(20); utf8.alignment.Set(WMComponents.AlignLeft);
  899. p.AddContent(utf8);
  900. (* --- buttons --- *)
  901. NEW(p);
  902. p.bounds.SetHeight(20); p.alignment.Set(WMComponents.AlignBottom);
  903. p.bearing.Set(WMRectangles.MakeRect(5,2,5,2));
  904. panel.AddContent(p);
  905. NEW(search);
  906. search.bounds.SetWidth(100); search.alignment.Set(WMComponents.AlignRight);
  907. search.caption.SetAOC("Search"); search.onClick.Add(SearchHandler);
  908. p.AddContent(search);
  909. NEW(cancel);
  910. cancel.bounds.SetWidth(100); cancel.alignment.Set(WMComponents.AlignRight);
  911. cancel.caption.SetAOC("Cancel"); cancel.onClick.Add(CancelHandler);
  912. p.AddContent(cancel);
  913. NEW(status); status.bounds.SetWidth(400); status.alignment.Set(WMComponents.AlignLeft);
  914. status.caption.SetAOC("Status: Ready");
  915. p.AddContent(status);
  916. RETURN panel;
  917. END CreateForm;
  918. PROCEDURE Close*;
  919. BEGIN
  920. Close^();
  921. DecCount();
  922. END Close;
  923. PROCEDURE Handle*(VAR x: WMMessages.Message);
  924. BEGIN
  925. IF (x.msgType = WMMessages.MsgExt) & (x.ext # NIL) & (x.ext IS KillerMsg) THEN
  926. Close();
  927. ELSE
  928. Handle^(x);
  929. END;
  930. END Handle;
  931. PROCEDURE SearchHandler(sender, data: ANY);
  932. VAR
  933. buffer, dateBuffer: Strings.Buffer;
  934. string, dateString: String;
  935. writer, dateWriter: Streams.Writer;
  936. i, dateCount: LONGINT;
  937. monthString: ARRAY 37 OF CHAR;
  938. valid: BOOLEAN;
  939. errorString: ARRAY 65 OF CHAR;
  940. BEGIN
  941. valid := TRUE;
  942. NEW(buffer, 16);
  943. writer := buffer.GetWriter();
  944. i := utf8.state.Get();
  945. IF i = 1 THEN writer.String("CHARSET UTF-8 "); END;
  946. i := answered.state.Get();
  947. IF i = 1 THEN writer.String("ANSWERED "); END;
  948. i := unanswered.state.Get();
  949. IF i = 1 THEN writer.String("UNANSWERED ") END;
  950. i := deleted.state.Get();
  951. IF i = 1 THEN writer.String("DELETED ") END;
  952. i := undeleted.state.Get();
  953. IF i = 1 THEN writer.String("UNDELETED ") END;
  954. i := draft.state.Get();
  955. IF i = 1 THEN writer.String("DRAFT ") END;
  956. i := undraft.state.Get();
  957. IF i = 1 THEN writer.String("UNDRAFT ") END;
  958. i := flagged.state.Get();
  959. IF i = 1 THEN writer.String("FLAGGED ") END;
  960. i := unflagged.state.Get();
  961. IF i = 1 THEN writer.String("UNFLAGGED ") END;
  962. i := seen.state.Get();
  963. IF i = 1 THEN writer.String("SEEN ") END;
  964. i := unseen.state.Get();
  965. IF i = 1 THEN writer.String("UNSEEN ") END;
  966. i := recent.state.Get();
  967. IF i = 1 THEN writer.String("RECENT ") END;
  968. i := old.state.Get();
  969. IF i = 1 THEN writer.String("OLD ") END;
  970. IMAPUtilities.TextToStr(subject.text, string);
  971. IF IMAPUtilities.StringLength(string^) > 0 THEN
  972. IMAPUtilities.MakeQuotedString(string);
  973. writer.String("SUBJECT ");
  974. writer.String(string^);
  975. writer.String(" ");
  976. END;
  977. IMAPUtilities.TextToStr(from.text, string);
  978. IF IMAPUtilities.StringLength(string^) > 0 THEN
  979. IMAPUtilities.MakeQuotedString(string);
  980. writer.String("FROM ");
  981. writer.String(string^);
  982. writer.String(" ");
  983. END;
  984. IMAPUtilities.TextToStr(text.text, string);
  985. IF IMAPUtilities.StringLength(string^) > 0 THEN
  986. IMAPUtilities.MakeQuotedString(string);
  987. writer.String("BODY ");
  988. writer.String(string^);
  989. writer.String(" ");
  990. END;
  991. IMAPUtilities.TextToStr(minSize.text, string);
  992. IF IMAPUtilities.StringLength(string^) > 0 THEN
  993. Strings.StrToInt(string^, i);
  994. Strings.IntToStr(i-1, string^);
  995. writer.String("LARGER ");
  996. writer.String(string^);
  997. writer.String(" ");
  998. END;
  999. IMAPUtilities.TextToStr(maxSize.text, string);
  1000. IF IMAPUtilities.StringLength(string^) > 0 THEN
  1001. Strings.StrToInt(string^,i);
  1002. Strings.IntToStr(i+1, string^);
  1003. writer.String("SMALLER ");
  1004. writer.String(string^);
  1005. writer.String(" ");
  1006. END;
  1007. dateCount := 0;
  1008. i := before.state.Get();
  1009. IF i = 1 THEN INC(dateCount); END;
  1010. i := on.state.Get();
  1011. IF i = 1 THEN INC(dateCount); END;
  1012. i := after.state.Get();
  1013. IF i = 1 THEN INC(dateCount); END;
  1014. IF dateCount = 3 THEN
  1015. (* It doesn't make sense to do an OR on before, on and after because it is always true *)
  1016. ELSE
  1017. IF dateCount = 2 THEN
  1018. (* do an OR *)
  1019. writer.String("OR ");
  1020. END;
  1021. NEW(dateBuffer, 16);
  1022. dateWriter := dateBuffer.GetWriter();
  1023. IMAPUtilities.TextToStr(day.text, string);
  1024. IF IMAPUtilities.StringLength(string^) > 0 THEN
  1025. Strings.StrToInt(string^,i);
  1026. IF (i < 1) OR (i > 31) THEN
  1027. valid := FALSE;
  1028. COPY("Day should be between 1 and 31", errorString);
  1029. END;
  1030. Strings.IntToStr(i, string^);
  1031. dateWriter.String(string^);
  1032. dateWriter.String("-");
  1033. END;
  1034. IMAPUtilities.TextToStr(month.text, string);
  1035. IF IMAPUtilities.StringLength(string^) > 0 THEN
  1036. Strings.StrToInt(string^,i);
  1037. IF (i < 1) OR (i > 12) THEN
  1038. valid := FALSE;
  1039. COPY("Month should be between 1 and 12", errorString);
  1040. ELSE
  1041. COPY("JanFebMarAprMayJunJulAugSepOctNovDec", monthString);
  1042. IMAPUtilities.StringCopy(monthString, (3*i)-3, 3, string^);
  1043. dateWriter.String(string^);
  1044. dateWriter.String("-");
  1045. END;
  1046. END;
  1047. IMAPUtilities.TextToStr(year.text, string);
  1048. IF IMAPUtilities.StringLength(string^) > 0 THEN
  1049. Strings.StrToInt(string^,i);
  1050. Strings.IntToStr(i, string^);
  1051. IF IMAPUtilities.StringLength(string^) # 4 THEN
  1052. valid := FALSE;
  1053. COPY("Year should consist of 4 digits", errorString);
  1054. END;
  1055. dateWriter.String(string^);
  1056. END;
  1057. dateString := dateBuffer.GetString();
  1058. i := before.state.Get();
  1059. IF i = 1 THEN
  1060. writer.String("BEFORE ");
  1061. writer.String(dateString^);
  1062. writer.String(" ");
  1063. END;
  1064. i := on.state.Get();
  1065. IF i = 1 THEN
  1066. writer.String("ON ");
  1067. writer.String(dateString^);
  1068. writer.String(" ");
  1069. END;
  1070. i := after.state.Get();
  1071. IF i = 1 THEN
  1072. writer.String("SINCE ");
  1073. writer.String(dateString^);
  1074. writer.String(" ");
  1075. END;
  1076. END;
  1077. IF valid THEN
  1078. string := buffer.GetString();
  1079. Strings.TrimRight(string^, " ");
  1080. IF DEBUG THEN KernelLog.String("Performing search..."); END;
  1081. status.caption.SetAOC("Status: Performing search...");
  1082. i := w.client.Search(string^);
  1083. IF i < 0 THEN
  1084. status.caption.SetAOC("Status: Searching Not Successful");
  1085. ELSE
  1086. NEW(buffer,16);
  1087. writer := buffer.GetWriter();
  1088. writer.String("Status: Finished. ");
  1089. NEW(string, 20);
  1090. Strings.IntToStr(i, string^);
  1091. writer.String(string^);
  1092. writer.String(" messages found.");
  1093. string := buffer.GetString();
  1094. status.caption.SetAOC(string^);
  1095. IF DEBUG THEN KernelLog.String("Search finished. "); KernelLog.Int(i,0); KernelLog.String(" messages found"); KernelLog.Ln(); END;
  1096. w.messageGrid.SetTopPosition(0,0,TRUE);
  1097. w.timer.Wakeup();
  1098. END;
  1099. ELSE
  1100. NEW(buffer,16);
  1101. writer := buffer.GetWriter();
  1102. writer.String("Status: Invalid Input: ");
  1103. writer.String(errorString);
  1104. string := buffer.GetString();
  1105. status.caption.SetAOC(string^);
  1106. OutputError(errorString);
  1107. END;
  1108. END SearchHandler;
  1109. PROCEDURE CancelHandler(sender, data: ANY);
  1110. VAR
  1111. BEGIN
  1112. Close^;
  1113. END CancelHandler;
  1114. END SearchWindow;
  1115. PreferencesWindow = OBJECT (WMComponents.FormWindow)
  1116. VAR
  1117. SMTPServer, SMTPThisHost, SentFolder, DraftFolder, TrashBin, From: WMEditors.Editor;
  1118. ExpungeOnFolderChange, ExpungeOnDelete, UseDragNDropAsMove, ExpungeOnMove, UseATrashBin: WMStandardComponents.Checkbox;
  1119. ok, cancel: WMStandardComponents.Button;
  1120. window: Window;
  1121. oldPreferences: IMAPClient.AccountPreferences;
  1122. PROCEDURE &New*(win: Window);
  1123. VAR
  1124. vc : WMComponents.VisualComponent;
  1125. BEGIN
  1126. IncCount();
  1127. window := win;
  1128. IF window.client # NIL THEN
  1129. oldPreferences := window.client.preferences;
  1130. ELSE
  1131. NEW(oldPreferences);
  1132. END;
  1133. vc := CreateForm();
  1134. Init(vc.bounds.GetWidth(), vc.bounds.GetHeight(), FALSE);
  1135. SetContent(vc);
  1136. SetTitle(Strings.NewString("Preferences"));
  1137. WMWindowManager.DefaultAddWindow(SELF);
  1138. END New;
  1139. PROCEDURE CreateForm() : WMComponents.VisualComponent;
  1140. VAR
  1141. panel : WMStandardComponents.Panel;
  1142. label: WMStandardComponents.Label;
  1143. p: WMStandardComponents.Panel;
  1144. rect: WMRectangles.Rectangle;
  1145. BEGIN
  1146. NEW(panel); panel.bounds.SetExtents(500, 400); panel.fillColor.Set(LONGINT(0CCCCCCFFH));
  1147. rect := WMRectangles.MakeRect(5, 2, 5, 2);
  1148. NEW(p); p.bounds.SetHeight(25); p.alignment.Set(WMComponents.AlignTop);
  1149. p.bearing.Set(rect);
  1150. NEW(label); label.bounds.SetWidth(200); label.alignment.Set(WMComponents.AlignLeft);
  1151. label.caption.SetAOC("IMAP server name: ");
  1152. p.AddContent(label);
  1153. NEW(label); label.alignment.Set(WMComponents.AlignClient);
  1154. label.caption.Set(window.client.preferences.IMAPServer);
  1155. p.AddContent(label);
  1156. panel.AddContent(p);
  1157. NEW(p); p.bounds.SetHeight(25); p.alignment.Set(WMComponents.AlignTop);
  1158. p.bearing.Set(rect);
  1159. NEW(label); label.bounds.SetWidth(200); label.alignment.Set(WMComponents.AlignLeft);
  1160. label.caption.SetAOC("IMAP user name: ");
  1161. p.AddContent(label);
  1162. NEW(label); label.alignment.Set(WMComponents.AlignClient);
  1163. label.caption.Set(window.client.preferences.UserName);
  1164. p.AddContent(label);
  1165. panel.AddContent(p);
  1166. NEW(p); p.bounds.SetHeight(25); p.alignment.Set(WMComponents.AlignTop);
  1167. p.bearing.Set(rect);
  1168. NEW(label); label.bounds.SetWidth(200); label.alignment.Set(WMComponents.AlignLeft);
  1169. label.caption.SetAOC("SMTP server name: ");
  1170. p.AddContent(label);
  1171. NEW(SMTPServer); SMTPServer.alignment.Set(WMComponents.AlignClient);
  1172. SMTPServer.multiLine.Set(FALSE); SMTPServer.fillColor.Set(LONGINT(0FFFFFFFFH)); SMTPServer.tv.showBorder.Set(TRUE);
  1173. SMTPServer.tv.textAlignV.Set(WMGraphics.AlignCenter);
  1174. SMTPServer.SetAsString(oldPreferences.SMTPServer^);
  1175. p.AddContent(SMTPServer);
  1176. panel.AddContent(p);
  1177. NEW(p); p.bounds.SetHeight(25); p.alignment.Set(WMComponents.AlignTop);
  1178. p.bearing.Set(rect);
  1179. NEW(label); label.bounds.SetWidth(200); label.alignment.Set(WMComponents.AlignLeft);
  1180. label.caption.SetAOC("Name of this host(for SMTP): ");
  1181. p.AddContent(label);
  1182. NEW(SMTPThisHost); SMTPThisHost.alignment.Set(WMComponents.AlignClient);
  1183. SMTPThisHost.multiLine.Set(FALSE); SMTPThisHost.fillColor.Set(LONGINT(0FFFFFFFFH)); SMTPThisHost.tv.showBorder.Set(TRUE);
  1184. SMTPThisHost.tv.textAlignV.Set(WMGraphics.AlignCenter);
  1185. SMTPThisHost.SetAsString(oldPreferences.SMTPThisHost^);
  1186. p.AddContent(SMTPThisHost);
  1187. panel.AddContent(p);
  1188. NEW(p); p.bounds.SetHeight(25); p.alignment.Set(WMComponents.AlignTop);
  1189. p.bearing.Set(rect);
  1190. NEW(label); label.bounds.SetWidth(100); label.alignment.Set(WMComponents.AlignLeft);
  1191. label.caption.SetAOC("Sent Folder: ");
  1192. p.AddContent(label);
  1193. NEW(SentFolder); SentFolder.alignment.Set(WMComponents.AlignClient);
  1194. SentFolder.multiLine.Set(FALSE); SentFolder.fillColor.Set(LONGINT(0FFFFFFFFH)); SentFolder.tv.showBorder.Set(TRUE);
  1195. SentFolder.tv.textAlignV.Set(WMGraphics.AlignCenter);
  1196. SentFolder.SetAsString(oldPreferences.SentFolder^);
  1197. p.AddContent(SentFolder);
  1198. panel.AddContent(p);
  1199. NEW(p); p.bounds.SetHeight(25); p.alignment.Set(WMComponents.AlignTop);
  1200. p.bearing.Set(rect);
  1201. NEW(label); label.bounds.SetWidth(100); label.alignment.Set(WMComponents.AlignLeft);
  1202. label.caption.SetAOC("Draft Folder: ");
  1203. p.AddContent(label);
  1204. NEW(DraftFolder); DraftFolder.alignment.Set(WMComponents.AlignClient);
  1205. DraftFolder.multiLine.Set(FALSE); DraftFolder.fillColor.Set(LONGINT(0FFFFFFFFH)); DraftFolder.tv.showBorder.Set(TRUE);
  1206. DraftFolder.tv.textAlignV.Set(WMGraphics.AlignCenter);
  1207. DraftFolder.SetAsString(oldPreferences.DraftFolder^);
  1208. p.AddContent(DraftFolder);
  1209. panel.AddContent(p);
  1210. NEW(p); p.bounds.SetHeight(20); p.alignment.Set(WMComponents.AlignTop);
  1211. p.bearing.Set(rect);
  1212. NEW(label); label.bounds.SetWidth(200); label.alignment.Set(WMComponents.AlignLeft);
  1213. label.caption.SetAOC("Use A Trash Bin: ");
  1214. p.AddContent(label);
  1215. NEW(UseATrashBin); UseATrashBin.bounds.SetWidth(20); UseATrashBin.alignment.Set(WMComponents.AlignLeft);
  1216. IF oldPreferences.UseATrashBin THEN
  1217. UseATrashBin.state.Set(1);
  1218. ELSE
  1219. UseATrashBin.state.Set(0);
  1220. END;
  1221. p.AddContent(UseATrashBin);
  1222. panel.AddContent(p);
  1223. NEW(p); p.bounds.SetHeight(25); p.alignment.Set(WMComponents.AlignTop);
  1224. p.bearing.Set(rect);
  1225. NEW(label); label.bounds.SetWidth(100); label.alignment.Set(WMComponents.AlignLeft);
  1226. label.caption.SetAOC("Trash Bin: ");
  1227. p.AddContent(label);
  1228. NEW(TrashBin); TrashBin.alignment.Set(WMComponents.AlignClient);
  1229. TrashBin.multiLine.Set(FALSE); TrashBin.fillColor.Set(LONGINT(0FFFFFFFFH)); TrashBin.tv.showBorder.Set(TRUE);
  1230. TrashBin.tv.textAlignV.Set(WMGraphics.AlignCenter);
  1231. TrashBin.SetAsString(oldPreferences.TrashBin^);
  1232. p.AddContent(TrashBin);
  1233. panel.AddContent(p);
  1234. NEW(p); p.bounds.SetHeight(25); p.alignment.Set(WMComponents.AlignTop);
  1235. p.bearing.Set(rect);
  1236. NEW(label); label.bounds.SetWidth(100); label.alignment.Set(WMComponents.AlignLeft);
  1237. label.caption.SetAOC("From Field: ");
  1238. p.AddContent(label);
  1239. NEW(From); From.alignment.Set(WMComponents.AlignClient);
  1240. From.multiLine.Set(FALSE); From.fillColor.Set(LONGINT(0FFFFFFFFH)); From.tv.showBorder.Set(TRUE);
  1241. From.tv.textAlignV.Set(WMGraphics.AlignCenter);
  1242. From.SetAsString(oldPreferences.From^);
  1243. p.AddContent(From);
  1244. panel.AddContent(p);
  1245. NEW(p); p.bounds.SetHeight(20); p.alignment.Set(WMComponents.AlignTop);
  1246. p.bearing.Set(rect);
  1247. NEW(label); label.bounds.SetWidth(200); label.alignment.Set(WMComponents.AlignLeft);
  1248. label.caption.SetAOC("Expunge On Folder Change: ");
  1249. p.AddContent(label);
  1250. NEW(ExpungeOnFolderChange); ExpungeOnFolderChange.bounds.SetWidth(20); ExpungeOnFolderChange.alignment.Set(WMComponents.AlignLeft);
  1251. IF oldPreferences.ExpungeOnFolderChange THEN
  1252. ExpungeOnFolderChange.state.Set(1);
  1253. ELSE
  1254. ExpungeOnFolderChange.state.Set(0);
  1255. END;
  1256. p.AddContent(ExpungeOnFolderChange);
  1257. panel.AddContent(p);
  1258. NEW(p); p.bounds.SetHeight(20); p.alignment.Set(WMComponents.AlignTop);
  1259. p.bearing.Set(rect);
  1260. NEW(label); label.bounds.SetWidth(200); label.alignment.Set(WMComponents.AlignLeft);
  1261. label.caption.SetAOC("Expunge On Delete: ");
  1262. p.AddContent(label);
  1263. NEW(ExpungeOnDelete); ExpungeOnDelete.bounds.SetWidth(20); ExpungeOnDelete.alignment.Set(WMComponents.AlignLeft);
  1264. IF oldPreferences.ExpungeOnDelete THEN
  1265. ExpungeOnDelete.state.Set(1);
  1266. ELSE
  1267. ExpungeOnDelete.state.Set(0);
  1268. END;
  1269. p.AddContent(ExpungeOnDelete);
  1270. panel.AddContent(p);
  1271. NEW(p); p.bounds.SetHeight(20); p.alignment.Set(WMComponents.AlignTop);
  1272. p.bearing.Set(rect);
  1273. NEW(label); label.bounds.SetWidth(200); label.alignment.Set(WMComponents.AlignLeft);
  1274. label.caption.SetAOC("Use Drag'n'Drop as Move: ");
  1275. p.AddContent(label);
  1276. NEW(UseDragNDropAsMove); UseDragNDropAsMove.bounds.SetWidth(20); UseDragNDropAsMove.alignment.Set(WMComponents.AlignLeft);
  1277. IF oldPreferences.UseDragNDropAsMove THEN
  1278. UseDragNDropAsMove.state.Set(1);
  1279. ELSE
  1280. UseDragNDropAsMove.state.Set(0);
  1281. END;
  1282. p.AddContent(UseDragNDropAsMove);
  1283. panel.AddContent(p);
  1284. NEW(p); p.bounds.SetHeight(20); p.alignment.Set(WMComponents.AlignTop);
  1285. p.bearing.Set(rect);
  1286. NEW(label); label.bounds.SetWidth(200); label.alignment.Set(WMComponents.AlignLeft);
  1287. label.caption.SetAOC("Expunge On Move: ");
  1288. p.AddContent(label);
  1289. NEW(ExpungeOnMove); ExpungeOnMove.bounds.SetWidth(20); ExpungeOnMove.alignment.Set(WMComponents.AlignLeft);
  1290. IF oldPreferences.ExpungeOnMove THEN
  1291. ExpungeOnMove.state.Set(1);
  1292. ELSE
  1293. ExpungeOnMove.state.Set(0);
  1294. END;
  1295. p.AddContent(ExpungeOnMove);
  1296. panel.AddContent(p);
  1297. NEW(p); p.bounds.SetHeight(20); p.alignment.Set(WMComponents.AlignBottom);
  1298. NEW(ok);
  1299. ok.bounds.SetWidth(100); ok.alignment.Set(WMComponents.AlignRight);
  1300. ok.caption.SetAOC("OK"); ok.onClick.Add(OKHandler);
  1301. p.AddContent(ok);
  1302. NEW(cancel);
  1303. cancel.bounds.SetWidth(100); cancel.alignment.Set(WMComponents.AlignRight);
  1304. cancel.caption.SetAOC("Cancel"); cancel.onClick.Add(CancelHandler);
  1305. p.AddContent(cancel);
  1306. panel.AddContent(p);
  1307. RETURN panel;
  1308. END CreateForm;
  1309. PROCEDURE Close*;
  1310. BEGIN
  1311. Close^();
  1312. DecCount();
  1313. END Close;
  1314. PROCEDURE Handle*(VAR x: WMMessages.Message);
  1315. BEGIN
  1316. IF (x.msgType = WMMessages.MsgExt) & (x.ext # NIL) & (x.ext IS KillerMsg) THEN
  1317. Close();
  1318. ELSE
  1319. Handle^(x);
  1320. END;
  1321. END Handle;
  1322. PROCEDURE OKHandler(sender, data: ANY);
  1323. VAR
  1324. i: LONGINT;
  1325. string: String;
  1326. preferences: IMAPClient.AccountPreferences;
  1327. BEGIN
  1328. IF window # NIL THEN
  1329. preferences := window.client.preferences;
  1330. IMAPUtilities.TextToStr(SMTPServer.text, string);
  1331. window.client.preferences.SMTPServer := string;
  1332. IMAPUtilities.TextToStr(SMTPThisHost.text, string);
  1333. preferences.SMTPThisHost := string;
  1334. IMAPUtilities.TextToStr(SentFolder.text, string);
  1335. preferences.SentFolder := string;
  1336. IMAPUtilities.TextToStr(DraftFolder.text, string);
  1337. preferences.DraftFolder := string;
  1338. IMAPUtilities.TextToStr(TrashBin.text, string);
  1339. preferences.TrashBin := string;
  1340. IMAPUtilities.TextToStr(From.text, string);
  1341. preferences.From := string;
  1342. i := ExpungeOnFolderChange.state.Get();
  1343. preferences.ExpungeOnFolderChange := (i=1);
  1344. i := ExpungeOnDelete.state.Get();
  1345. preferences.ExpungeOnDelete := (i=1);
  1346. i := UseDragNDropAsMove.state.Get();
  1347. preferences.UseDragNDropAsMove := (i=1);
  1348. i := ExpungeOnMove.state.Get();
  1349. preferences.ExpungeOnMove := (i=1);
  1350. i := UseATrashBin.state.Get();
  1351. preferences.UseATrashBin := (i=1);
  1352. ELSE
  1353. OutputError("Updating Preferences not possible, because Client is not initialized");
  1354. END;
  1355. Close^();
  1356. END OKHandler;
  1357. PROCEDURE CancelHandler(sender, data: ANY);
  1358. BEGIN
  1359. Close^;
  1360. END CancelHandler;
  1361. END PreferencesWindow;
  1362. Window = OBJECT (WMComponents.FormWindow)
  1363. VAR
  1364. topToolbar, messagePanel : WMStandardComponents.Panel;
  1365. statusLabel, currentFolderLabel, currentMessagesLabel: WMStandardComponents.Label;
  1366. connect, disconnect, reload, abort, search, save, load, new, expunge, preferences, download, switchToOffline, switchToOnline: WMStandardComponents.Button;
  1367. messageGrid : WMStringGrids.StringGrid;
  1368. folderTree: WMTrees.TreeView;
  1369. tree: WMTrees.Tree;
  1370. colWidths : WMGrids.Spacings;
  1371. address: WMEditors.Editor;
  1372. popup: WMPopups.Popup;
  1373. px, py : LONGINT;
  1374. IconRead, IconAnswered, IconUnread, IconDeleted: WMGraphics.Image;
  1375. copyTarget: IMAPClient.Folder;
  1376. client: IMAPClient.Client;
  1377. timer: Kernel.Timer;
  1378. updateFlag: BOOLEAN;
  1379. active: BOOLEAN;
  1380. PROCEDURE &New*(c: WMRestorable.Context);
  1381. VAR vc : WMComponents.VisualComponent; panel : WMStandardComponents.Panel;
  1382. BEGIN
  1383. NEW(client, RefreshDisplay, OutputError);
  1384. vc := CreateForm();
  1385. Init(vc.bounds.GetWidth(), vc.bounds.GetHeight(), FALSE);
  1386. SetContent(vc);
  1387. SetTitle(Strings.NewString(WindowTitle));
  1388. SetIcon(WMGraphics.LoadImage("WMIcons.tar://IMAPGUI.png", TRUE));
  1389. active := TRUE;
  1390. updateFlag := FALSE;
  1391. copyTarget := NIL;
  1392. IconRead := WMGraphics.LoadImage("IMAPIcons.tar://IMAPIconRead.png", FALSE);
  1393. IconAnswered := WMGraphics.LoadImage("IMAPIcons.tar://IMAPIconAnswered.png", FALSE);
  1394. IconUnread := WMGraphics.LoadImage("IMAPIcons.tar://IMAPIconUnread.png", FALSE);
  1395. IconDeleted := WMGraphics.LoadImage("IMAPIcons.tar://IMAPIconDeleted.png", FALSE);
  1396. IF DEBUG THEN KernelLog.String("Window initialisiert"); KernelLog.Ln(); END;
  1397. IncCount();
  1398. IF c # NIL THEN
  1399. WMRestorable.AddByContext(SELF, c);
  1400. Resized(GetWidth(), GetHeight());
  1401. ELSE
  1402. WMWindowManager.DefaultAddWindow(SELF);
  1403. END;
  1404. END New;
  1405. (* Wird aufgerufen, wenn das Fenster seine Groesse aendert *)
  1406. PROCEDURE Resized*(width, height : LONGINT);
  1407. BEGIN
  1408. Resized^(width, height);
  1409. ResizeGrid;
  1410. END Resized;
  1411. PROCEDURE ResizeGrid;
  1412. BEGIN
  1413. IF LEN(colWidths) = 4 THEN
  1414. NEW(colWidths, 4);
  1415. colWidths[0] := (messageGrid.bounds.GetWidth() DIV 8)*2;
  1416. colWidths[1] := (messageGrid.bounds.GetWidth() DIV 8)*3;
  1417. colWidths[2] := messageGrid.bounds.GetWidth() DIV 4;
  1418. colWidths[3] := messageGrid.bounds.GetWidth() DIV 8;
  1419. ELSE
  1420. NEW(colWidths, 1);
  1421. colWidths[0] := messageGrid.bounds.GetWidth();
  1422. END;
  1423. messageGrid.SetColSpacings(colWidths);
  1424. END ResizeGrid;
  1425. PROCEDURE CreateForm() : WMComponents.VisualComponent;
  1426. VAR
  1427. panel : WMStandardComponents.Panel;
  1428. label : WMStandardComponents.Label;
  1429. p: WMStandardComponents.Panel;
  1430. rect: WMRectangles.Rectangle;
  1431. root: WMTrees.TreeNode;
  1432. BEGIN
  1433. rect := WMRectangles.MakeRect(2,3,0,3);
  1434. NEW(panel); panel.bounds.SetExtents(1024, 768); panel.fillColor.Set(WMGraphics.White);
  1435. (* --- Toolbar --- *)
  1436. NEW(topToolbar); topToolbar.bounds.SetHeight(78); topToolbar.alignment.Set(WMComponents.AlignTop);
  1437. topToolbar.fillColor.Set(LONGINT(0CCCCCCFFH));
  1438. panel.AddContent(topToolbar);
  1439. NEW(p); p.bounds.SetHeight(26); p.alignment.Set(WMComponents.AlignTop);
  1440. topToolbar.AddContent(p);
  1441. NEW(label); label.bounds.SetWidth(40); label.alignment.Set(WMComponents.AlignLeft);
  1442. label.caption.SetAOC("Host: "); label.textColor.Set(0000000FFH); label.bearing.Set(rect); p.AddContent(label);
  1443. NEW(address); address.bounds.SetWidth(160); address.alignment.Set(WMComponents.AlignLeft);
  1444. address.multiLine.Set(FALSE); address.fillColor.Set(LONGINT(0FFFFFFFFH)); address.bearing.Set(rect); address.tv.showBorder.Set(TRUE);
  1445. address.tv.textAlignV.Set(WMGraphics.AlignCenter);
  1446. address.tv.borders.Set(WMRectangles.MakeRect(3,3,1,1));
  1447. address.onEnter.Add(ButtonHandler);
  1448. p.AddContent(address);
  1449. IMAPUtilities.SetEditorText(address, client.preferences.IMAPServer);
  1450. NEW(connect); connect.bounds.SetWidth(100); connect.alignment.Set(WMComponents.AlignLeft);
  1451. connect.caption.SetAOC("Connect"); connect.bearing.Set(rect); connect.onClick.Add(ButtonHandler);
  1452. p.AddContent(connect);
  1453. NEW(disconnect); disconnect.bounds.SetWidth(100); disconnect.alignment.Set(WMComponents.AlignLeft);
  1454. disconnect.caption.SetAOC("Disconnect"); disconnect.bearing.Set(rect); disconnect.onClick.Add(ButtonHandler);
  1455. p.AddContent(disconnect);
  1456. NEW(save); save.bounds.SetWidth(100); save.alignment.Set(WMComponents.AlignLeft);
  1457. save.caption.SetAOC("Save Account"); save.bearing.Set(rect); save.onClick.Add(ButtonHandler);
  1458. p.AddContent(save);
  1459. NEW(load); load.bounds.SetWidth(100); load.alignment.Set(WMComponents.AlignLeft);
  1460. load.caption.SetAOC("Load Account"); load.bearing.Set(rect); load.onClick.Add(ButtonHandler);
  1461. p.AddContent(load);
  1462. NEW(switchToOffline); switchToOffline.bounds.SetWidth(100); switchToOffline.alignment.Set(WMComponents.AlignLeft);
  1463. switchToOffline.caption.SetAOC("Switch To Offline"); switchToOffline.bearing.Set(rect); switchToOffline.onClick.Add(ButtonHandler);
  1464. p.AddContent(switchToOffline);
  1465. NEW(switchToOnline); switchToOnline.bounds.SetWidth(100); switchToOnline.alignment.Set(WMComponents.AlignLeft);
  1466. switchToOnline.caption.SetAOC("Switch To Online"); switchToOnline.bearing.Set(rect); switchToOnline.onClick.Add(ButtonHandler);
  1467. p.AddContent(switchToOnline);
  1468. NEW(preferences); preferences.bounds.SetWidth(100); preferences.alignment.Set(WMComponents.AlignLeft);
  1469. preferences.caption.SetAOC("Preferences"); preferences.bearing.Set(rect); preferences.onClick.Add(ButtonHandler);
  1470. p.AddContent(preferences);
  1471. NEW(p); p.bounds.SetHeight(26); p.alignment.Set(WMComponents.AlignTop);
  1472. topToolbar.AddContent(p);
  1473. NEW(new); new.bounds.SetWidth(100); new.alignment.Set(WMComponents.AlignLeft);
  1474. new.caption.SetAOC("Send new"); new.bearing.Set(rect);new.onClick.Add(ButtonHandler);
  1475. p.AddContent(new);
  1476. NEW(reload); reload.bounds.SetWidth(100); reload.alignment.Set(WMComponents.AlignLeft);
  1477. reload.caption.SetAOC("Reload"); reload.bearing.Set(rect); reload.onClick.Add(ButtonHandler);
  1478. p.AddContent(reload);
  1479. NEW(abort); abort.bounds.SetWidth(100); abort.alignment.Set(WMComponents.AlignLeft);
  1480. abort.caption.SetAOC("Abort"); abort.bearing.Set(rect); abort.onClick.Add(ButtonHandler);
  1481. p.AddContent(abort);
  1482. NEW(search); search.bounds.SetWidth(100); search.alignment.Set(WMComponents.AlignLeft);
  1483. search.caption.SetAOC("Search"); search.bearing.Set(rect); search.onClick.Add(ButtonHandler);
  1484. p.AddContent(search);
  1485. NEW(expunge); expunge.bounds.SetWidth(100); expunge.alignment.Set(WMComponents.AlignLeft);
  1486. expunge.caption.SetAOC("Expunge"); expunge.bearing.Set(rect); expunge.onClick.Add(ButtonHandler);
  1487. p.AddContent(expunge);
  1488. NEW(download); download.bounds.SetWidth(100); download.alignment.Set(WMComponents.AlignLeft);
  1489. download.caption.SetAOC("Load all messages"); download.bearing.Set(rect); download.onClick.Add(ButtonHandler);
  1490. p.AddContent(download);
  1491. NEW(p);
  1492. p.bounds.SetHeight(26); p.alignment.Set(WMComponents.AlignTop);
  1493. topToolbar.AddContent(p);
  1494. (* --- currentMessagesLabel --- *)
  1495. NEW(currentMessagesLabel);
  1496. currentMessagesLabel.bounds.SetWidth(200);
  1497. currentMessagesLabel.alignment.Set(WMComponents.AlignLeft);
  1498. currentMessagesLabel.fillColor.Set(LONGINT(0CCCCCCFFH));
  1499. currentMessagesLabel.caption.SetAOC("Current Messages: 0 ");
  1500. currentMessagesLabel.bearing.Set(rect);
  1501. p.AddContent(currentMessagesLabel);
  1502. (* --- currentFolderLabel --- *)
  1503. NEW(currentFolderLabel);
  1504. currentFolderLabel.alignment.Set(WMComponents.AlignClient);
  1505. currentFolderLabel.fillColor.Set(LONGINT(0CCCCCCFFH));
  1506. currentFolderLabel.caption.SetAOC("Current Folder: ");
  1507. currentFolderLabel.bearing.Set(rect);
  1508. p.AddContent(currentFolderLabel);
  1509. (* --- statusbar --- *)
  1510. NEW(p);
  1511. p.bounds.SetHeight(20); p.alignment.Set(WMComponents.AlignBottom);
  1512. p.fillColor.Set(LONGINT(0CCCCCCFFH));
  1513. panel.AddContent(p);
  1514. NEW(statusLabel);
  1515. statusLabel.bounds.SetHeight(20);
  1516. statusLabel.alignment.Set(WMComponents.AlignTop);
  1517. statusLabel.bearing.Set(WMRectangles.MakeRect(3,0,0,0));
  1518. statusLabel.textColor.Set(0000000FFH);
  1519. statusLabel.SetCaption("Status: disconnected");
  1520. p.AddContent(statusLabel);
  1521. (* --- folderPanel --- *)
  1522. NEW(folderTree);
  1523. folderTree.bounds.SetWidth(200);
  1524. folderTree.alignment.Set(WMComponents.AlignLeft);
  1525. folderTree.bearing.Set(WMRectangles.MakeRect(3,3,0,0));
  1526. folderTree.fillColor.Set(WMGraphics.White);
  1527. folderTree.onClickNode.Add(ChangeFolder);
  1528. folderTree.SetExtContextMenuHandler(FolderContextMenu);
  1529. folderTree.SetExtDragDroppedHandler(MessagesDragDropped);
  1530. tree := folderTree.GetTree();
  1531. tree.Acquire();
  1532. NEW(root);
  1533. tree.SetRoot(root);
  1534. tree.SetNodeCaption(root, Strings.NewString("Folders"));
  1535. tree.Release();
  1536. panel.AddContent(folderTree);
  1537. (* --- messagePanel --- *)
  1538. NEW(messagePanel);
  1539. messagePanel.alignment.Set(WMComponents.AlignClient);
  1540. messagePanel.bounds.SetWidth(824);
  1541. messagePanel.fillColor.Set(LONGINT(0CCCCCCFFH));
  1542. panel.AddContent(messagePanel);
  1543. NEW(messageGrid);
  1544. messageGrid.alignment.Set(WMComponents.AlignClient);
  1545. messageGrid.bounds.SetWidth(824);
  1546. messageGrid.onClickSelected.Add(DisplayMessage);
  1547. messageGrid.SetExtContextMenuHandler(MessageContextMenu);
  1548. messageGrid.onStartDrag.Add(MessagesStartDrag);
  1549. messageGrid.fillColor.Set(WMGraphics.White);
  1550. NEW(colWidths, 1);
  1551. colWidths[0] := messageGrid.bounds.GetWidth();
  1552. messageGrid.model.Acquire;
  1553. messageGrid.SetColSpacings(colWidths);
  1554. messageGrid.model.SetNofCols(1);
  1555. messageGrid.model.SetNofRows(1);
  1556. messageGrid.fixedRows.Set(1);
  1557. messageGrid.clFixed.Set(LONGINT(0C0C0C0FFH));
  1558. messageGrid.model.SetCellText(0, 0, Strings.NewString(""));
  1559. messageGrid.SetSelectionMode(WMGrids.GridSelectRows);
  1560. messageGrid.showScrollX.Set(FALSE);
  1561. messageGrid.alwaysShowScrollX.Set(FALSE);
  1562. messageGrid.alwaysShowScrollY.Set(FALSE);
  1563. messageGrid.model.Release;
  1564. messagePanel.AddContent(messageGrid);
  1565. RETURN panel;
  1566. END CreateForm;
  1567. PROCEDURE ButtonHandler(sender, data: ANY);
  1568. BEGIN
  1569. IF sender = address THEN
  1570. Connect();
  1571. ELSIF sender = connect THEN
  1572. Connect();
  1573. ELSIF sender = disconnect THEN
  1574. Disconnect();
  1575. ELSIF sender = search THEN
  1576. Search();
  1577. ELSIF sender = reload THEN
  1578. Reload();
  1579. ELSIF sender = abort THEN
  1580. Abort();
  1581. ELSIF sender = save THEN
  1582. Save();
  1583. ELSIF sender = load THEN
  1584. Load();
  1585. ELSIF sender = new THEN
  1586. NewSend();
  1587. ELSIF sender = expunge THEN
  1588. Expunge();
  1589. ELSIF sender = preferences THEN
  1590. SetPreferences();
  1591. ELSIF sender = download THEN
  1592. DownloadAllMessages();
  1593. ELSIF sender = switchToOffline THEN
  1594. SwitchToOffline();
  1595. ELSIF sender = switchToOnline THEN
  1596. SwitchToOnline();
  1597. ELSE
  1598. OutputError("An Unknown Button was pressed");
  1599. END;
  1600. END ButtonHandler;
  1601. PROCEDURE DisplayMessage(sender, data: ANY);
  1602. VAR
  1603. message: IMAPClient.Message;
  1604. mw: MessageWindow;
  1605. i: LONGINT;
  1606. BEGIN
  1607. IF (data # NIL) & (data IS IMAPClient.Message) THEN
  1608. message := data(IMAPClient.Message);
  1609. IF (message.message = NIL) & (client.status = IMAPClient.ONLINE) THEN
  1610. client.abort := TRUE;
  1611. i := client.FetchMessage(message);
  1612. client.abort := FALSE;
  1613. client.timer.Wakeup();
  1614. END;
  1615. IF DEBUG THEN KernelLog.String("Display Message "); KernelLog.Int(i,0); KernelLog.Ln(); END;
  1616. NEW(mw, SELF);
  1617. mw.DisplayMessage(message);
  1618. ELSE
  1619. OutputError("Display Message NOT possible because your selection was invalid");
  1620. END;
  1621. END DisplayMessage;
  1622. PROCEDURE ChangeFolder(sender, data: ANY);
  1623. VAR
  1624. folder: IMAPClient.Folder;
  1625. treeNode: WMTrees.TreeNode;
  1626. p: ANY;
  1627. i: LONGINT;
  1628. BEGIN
  1629. IF (data # NIL) & (data IS WMTrees.TreeNode) THEN
  1630. treeNode := data(WMTrees.TreeNode);
  1631. p := tree.GetNodeData(treeNode);
  1632. IF p = NIL THEN RETURN; END;
  1633. folder := p(IMAPClient.Folder);
  1634. IF DEBUG THEN KernelLog.String("Change Folder: folder name: "); KernelLog.String(folder.name^); KernelLog.Ln(); END;
  1635. client.userAbort := FALSE;
  1636. client.abort := TRUE;
  1637. i := client.SelectFolder(folder);
  1638. client.abort := FALSE;
  1639. client.timer.Wakeup();
  1640. client.applySearchFilter := FALSE;
  1641. END;
  1642. messageGrid.Acquire;
  1643. messageGrid.SetTopPosition(0,0,TRUE);
  1644. messageGrid.Release;
  1645. RefreshDisplay();
  1646. END ChangeFolder;
  1647. PROCEDURE FolderContextMenu(sender : ANY; x, y: LONGINT);
  1648. VAR
  1649. p: ANY;
  1650. folder: IMAPClient.Folder;
  1651. selected: WMTrees.TreeNode;
  1652. BEGIN
  1653. (* find selected Node *)
  1654. selected := folderTree.GetNodeAtPos(x,y);
  1655. tree.Acquire;
  1656. p := tree.GetNodeData(selected);
  1657. IF p # NIL THEN
  1658. folder := p(IMAPClient.Folder);
  1659. IF DEBUG THEN KernelLog.String("Folder Name: "); KernelLog.String(folder.name^); KernelLog.Ln(); END;
  1660. NEW(popup);
  1661. popup.AddParButton("Create Sub-Folder", CreateDir, folder);
  1662. popup.AddParButton("Rename", RenameDir, folder);
  1663. popup.AddParButton("Delete", DeleteDir, folder);
  1664. popup.AddParButton("Select as Copy-Target", TargetDir, folder);
  1665. popup.AddParButton("Select as Sent Folder", SentFolder, folder);
  1666. popup.AddParButton("Select as Draft Folder", DraftFolder, folder);
  1667. popup.AddParButton("Select as Trash Bin", TrashBin, folder);
  1668. folderTree.ToWMCoordinates(x, y, px, py);
  1669. popup.Popup(px, py);
  1670. ELSE
  1671. IF DEBUG THEN KernelLog.String("No Folder Selected"); KernelLog.Ln(); END;
  1672. END;
  1673. tree.Release;
  1674. END FolderContextMenu;
  1675. PROCEDURE CreateDir(sender, data: ANY);
  1676. VAR
  1677. name : ARRAY 128 OF CHAR;
  1678. folder: IMAPClient.Folder;
  1679. r: LONGINT;
  1680. BEGIN
  1681. IF (data # NIL) & (data IS IMAPClient.Folder) THEN
  1682. folder := data(IMAPClient.Folder);
  1683. COPY("NewFolder", name);
  1684. IF WMDialogs.QueryString("Create Folder: ", name) = WMDialogs.ResOk THEN
  1685. IF DEBUG THEN KernelLog.String("Creating Folder: "); KernelLog.String(name); KernelLog.Ln; END;
  1686. client.abort := TRUE;
  1687. r := client.Create(folder, name);
  1688. client.abort := FALSE;
  1689. RefreshDisplay();
  1690. END;
  1691. END;
  1692. END CreateDir;
  1693. PROCEDURE RenameDir(sender, data: ANY);
  1694. VAR
  1695. folder: IMAPClient.Folder;
  1696. name : ARRAY 128 OF CHAR;
  1697. r: LONGINT;
  1698. BEGIN
  1699. IF (data # NIL) & (data IS IMAPClient.Folder) THEN
  1700. folder := data(IMAPClient.Folder);
  1701. COPY("NewName", name);
  1702. IF WMDialogs.QueryString("Rename Folder: ", name) = WMDialogs.ResOk THEN
  1703. IF DEBUG THEN KernelLog.String("Renaming Folder: "); KernelLog.String(folder.name^); KernelLog.String(" to "); KernelLog.String(name); KernelLog.Ln; END;
  1704. client.abort := TRUE;
  1705. r := client.Rename(folder, name);
  1706. client.abort := FALSE;
  1707. client.timer.Wakeup();
  1708. RefreshDisplay();
  1709. END
  1710. END;
  1711. END RenameDir;
  1712. PROCEDURE DeleteDir(sender, data: ANY);
  1713. VAR
  1714. folder: IMAPClient.Folder;
  1715. r: LONGINT;
  1716. buffer: Strings.Buffer;
  1717. w: Streams.Writer;
  1718. string: String;
  1719. BEGIN
  1720. IF (data # NIL) & (data IS IMAPClient.Folder) THEN
  1721. folder := data(IMAPClient.Folder);
  1722. NEW(buffer, 16);
  1723. w := buffer.GetWriter();
  1724. w.String("Do you want to delete the folder: ");
  1725. w.String(folder.name^);
  1726. string := buffer.GetString();
  1727. r := WMDialogs.Confirmation("Confirm deleting folder", string^);
  1728. IF r = WMDialogs.ResYes THEN
  1729. client.abort := TRUE;
  1730. r := client.Delete(folder);
  1731. client.abort := FALSE;
  1732. client.timer.Wakeup();
  1733. END;
  1734. END;
  1735. RefreshDisplay();
  1736. END DeleteDir;
  1737. PROCEDURE TargetDir(sender, data: ANY);
  1738. VAR
  1739. path: String;
  1740. BEGIN
  1741. IF (data # NIL) & (data IS IMAPClient.Folder) THEN
  1742. copyTarget := data(IMAPClient.Folder);
  1743. path := copyTarget.GetPath();
  1744. IF DEBUG THEN KernelLog.String("Copy-Target selected: "); KernelLog.String(path^); KernelLog.Ln(); END;
  1745. ELSE
  1746. IF DEBUG THEN KernelLog.String("No Copy-Target selected."); KernelLog.Ln(); END;
  1747. END;
  1748. END TargetDir;
  1749. PROCEDURE SentFolder(sender, data: ANY);
  1750. VAR
  1751. path: String;
  1752. folder: IMAPClient.Folder;
  1753. BEGIN
  1754. IF (data # NIL) & (data IS IMAPClient.Folder) THEN
  1755. folder := data(IMAPClient.Folder);
  1756. path := folder.GetPath();
  1757. client.preferences.SentFolder := path;
  1758. IF DEBUG THEN KernelLog.String("Sent Folder selected: "); KernelLog.String(path^); KernelLog.Ln(); END;
  1759. ELSE
  1760. IF DEBUG THEN KernelLog.String("No Sent Folder selected."); KernelLog.Ln(); END;
  1761. END;
  1762. END SentFolder;
  1763. PROCEDURE DraftFolder(sender, data: ANY);
  1764. VAR
  1765. path: String;
  1766. folder: IMAPClient.Folder;
  1767. BEGIN
  1768. IF (data # NIL) & (data IS IMAPClient.Folder) THEN
  1769. folder := data(IMAPClient.Folder);
  1770. path := folder.GetPath();
  1771. client.preferences.DraftFolder := path;
  1772. IF DEBUG THEN KernelLog.String("Draft Folder selected: "); KernelLog.String(path^); KernelLog.Ln(); END;
  1773. ELSE
  1774. IF DEBUG THEN KernelLog.String("No Draft Folder selected."); KernelLog.Ln(); END;
  1775. END;
  1776. END DraftFolder;
  1777. PROCEDURE TrashBin(sender, data: ANY);
  1778. VAR
  1779. path: String;
  1780. folder: IMAPClient.Folder;
  1781. BEGIN
  1782. IF (data # NIL) & (data IS IMAPClient.Folder) THEN
  1783. folder := data(IMAPClient.Folder);
  1784. path := folder.GetPath();
  1785. client.preferences.TrashBin := path;
  1786. client.preferences.UseATrashBin := TRUE;
  1787. IF DEBUG THEN KernelLog.String("Trash Bin selected: "); KernelLog.String(path^); KernelLog.Ln(); END;
  1788. ELSE
  1789. IF DEBUG THEN KernelLog.String("No Trash Bin selected."); KernelLog.Ln(); END;
  1790. END;
  1791. END TrashBin;
  1792. PROCEDURE MessagesDragDropped(x, y : LONGINT; dragInfo : WMWindowManager.DragInfo; VAR handled : BOOLEAN);
  1793. VAR
  1794. selected: WMTrees.TreeNode;
  1795. p: ANY;
  1796. folder: IMAPClient.Folder;
  1797. list: Classes.List;
  1798. i, r: LONGINT;
  1799. message: IMAPClient.Message;
  1800. successful: BOOLEAN;
  1801. path: String;
  1802. BEGIN
  1803. handled := TRUE;
  1804. IF DEBUG THEN KernelLog.String("MessagesDragDropped"); KernelLog.Ln(); END;
  1805. selected := folderTree.GetNodeAtPos(x,y);
  1806. tree.Acquire;
  1807. p := tree.GetNodeData(selected);
  1808. tree.Release;
  1809. IF p # NIL THEN
  1810. folder := p(IMAPClient.Folder);
  1811. IF DEBUG THEN KernelLog.String("Folder Name: "); KernelLog.String(folder.name^); KernelLog.Ln(); END;
  1812. ELSE
  1813. IF DEBUG THEN KernelLog.String("Folder NIL: "); KernelLog.Ln(); END;
  1814. END;
  1815. p := dragInfo.data;
  1816. IF p IS Classes.List THEN
  1817. IF DEBUG THEN KernelLog.String("Classes.List"); KernelLog.Ln(); END;
  1818. list := p(Classes.List);
  1819. i := 0;
  1820. client.abort := TRUE;
  1821. successful := TRUE;
  1822. WHILE i < list.GetCount() DO
  1823. p := list.GetItem(i);
  1824. message := p(IMAPClient.Message);
  1825. path := folder.GetPath();
  1826. r := client.CopyMessage(message, path);
  1827. IF (r = IMAPClient.OK) & client.preferences.UseDragNDropAsMove THEN
  1828. r := client.DeleteMessage(message, client.preferences.ExpungeOnMove);
  1829. ELSE
  1830. successful := FALSE;
  1831. END;
  1832. INC(i);
  1833. END;
  1834. IF successful & client.preferences.ExpungeOnMove THEN
  1835. r := client.Expunge();
  1836. END;
  1837. client.abort := FALSE;
  1838. client.timer.Wakeup();
  1839. ELSE
  1840. IF DEBUG THEN KernelLog.String("Not Classes.List "); KernelLog.Ln(); END;
  1841. END;
  1842. END MessagesDragDropped;
  1843. PROCEDURE MessagesStartDrag(sender,data: ANY);
  1844. VAR
  1845. list: Classes.List;
  1846. img : WMGraphics.Image;
  1847. c : WMGraphics.BufferCanvas;
  1848. top, i: LONGINT;
  1849. p: ANY;
  1850. message: IMAPClient.Message;
  1851. BEGIN
  1852. IF DEBUG THEN KernelLog.String("In MessageStartDrag"); KernelLog.Ln(); END;
  1853. list := GetMessageSelection();
  1854. (* render to bitmap *)
  1855. NEW(img); Raster.Create(img, 100, 200, Raster.BGRA8888);
  1856. NEW(c, img);
  1857. c.SetColor(LONGINT(0FFFF00FFH));
  1858. top := 0;
  1859. FOR i := 0 TO list.GetCount() - 1 DO
  1860. c.Fill(WMRectangles.MakeRect(0, top, 100, top + 25), 0FF80H, WMGraphics.ModeCopy);
  1861. p := list.GetItem(i);
  1862. message := p(IMAPClient.Message);
  1863. c.DrawString(3, top + 20, message.header.subject^);
  1864. INC(top, 25)
  1865. END;
  1866. IF messageGrid.StartDrag(list, img, 0,0,DragArrivedList, NIL) THEN
  1867. IF DEBUG THEN KernelLog.String("DraggingStarted"); KernelLog.Ln(); END;
  1868. ELSE
  1869. IF DEBUG THEN KernelLog.String("Drag could not be started"); KernelLog.Ln(); END;
  1870. END;
  1871. END MessagesStartDrag;
  1872. PROCEDURE DragArrivedList(sender, data : ANY);
  1873. BEGIN
  1874. IF DEBUG THEN KernelLog.String("DragArrivedList"); KernelLog.Ln(); END;
  1875. IF sender = tree THEN
  1876. KernelLog.String("TREE"); KernelLog.Ln();
  1877. ELSE
  1878. KernelLog.String("Unknown"); KernelLog.Ln();
  1879. END;
  1880. IF data IS Classes.List THEN
  1881. KernelLog.String("data vom Type List"); KernelLog.Ln();
  1882. ELSE
  1883. KernelLog.String("data nicht vom Type List"); KernelLog.Ln();
  1884. END;
  1885. END DragArrivedList;
  1886. PROCEDURE MessageContextMenu(sender : ANY; x, y: LONGINT);
  1887. VAR
  1888. list: Classes.List;
  1889. BEGIN
  1890. px := x; py := y;
  1891. NEW(popup);
  1892. list := GetMessageSelection();
  1893. IF list.GetCount() > 0 THEN
  1894. popup.AddParButton("Copy to Target", CopyMessages, list);
  1895. popup.AddParButton("Delete", DeleteMessages, list);
  1896. popup.AddParButton("Restore", RestoreMessages, list);
  1897. END;
  1898. messageGrid.ToWMCoordinates(x, y, px, py);
  1899. popup.Popup(px, py);
  1900. END MessageContextMenu;
  1901. PROCEDURE GetMessageSelection() : Classes.List;
  1902. VAR selection : Classes.List;
  1903. l, t, r, b, NofSel, i : LONGINT;
  1904. p : ANY;
  1905. message: IMAPClient.Message;
  1906. BEGIN
  1907. messageGrid.model.Acquire;
  1908. messageGrid.GetSelection(l, t, r, b);
  1909. NofSel:= b- t + 1;
  1910. IF NofSel > 0 THEN
  1911. NEW(selection);
  1912. i := t;
  1913. WHILE i <= b DO
  1914. p := messageGrid.model.GetCellData(0, i);
  1915. IF (p # NIL) & (p IS IMAPClient.Message) THEN
  1916. message := p(IMAPClient.Message);
  1917. selection.Add(message);
  1918. END;
  1919. INC(i);
  1920. END;
  1921. END;
  1922. messageGrid.model.Release;
  1923. RETURN selection
  1924. END GetMessageSelection;
  1925. PROCEDURE CopyMessages(sender, data: ANY);
  1926. VAR
  1927. list: Classes.List;
  1928. i, r: LONGINT;
  1929. p: ANY;
  1930. message: IMAPClient.Message;
  1931. path: String;
  1932. BEGIN
  1933. IF copyTarget # NIL THEN
  1934. list := data(Classes.List);
  1935. i := 0;
  1936. client.abort := TRUE;
  1937. WHILE i < list.GetCount() DO
  1938. p := list.GetItem(i);
  1939. message := p(IMAPClient.Message);
  1940. path := copyTarget.GetPath();
  1941. r := client.CopyMessage(message, path);
  1942. INC(i);
  1943. END;
  1944. client.abort := FALSE;
  1945. client.timer.Wakeup();
  1946. ELSE
  1947. OutputError("Copy NOT possible because there is no copy Target selected");
  1948. END;
  1949. END CopyMessages;
  1950. PROCEDURE DeleteMessages(sender, data: ANY);
  1951. VAR
  1952. list: Classes.List;
  1953. i, r: LONGINT;
  1954. p: ANY;
  1955. message: IMAPClient.Message;
  1956. BEGIN
  1957. list := data(Classes.List);
  1958. IF list # NIL THEN
  1959. i := 0;
  1960. client.abort := TRUE;
  1961. IF DEBUG THEN KernelLog.String("Delete "); KernelLog.Int(list.GetCount(),0); KernelLog.String(" messages."); KernelLog.Ln(); END;
  1962. WHILE i < list.GetCount() DO
  1963. p := list.GetItem(i);
  1964. message := p(IMAPClient.Message);
  1965. IF (client.preferences.UseATrashBin) THEN
  1966. r := client.MoveMessageToTrashBin(message);
  1967. ELSE
  1968. r := client.DeleteMessage(message, client.preferences.ExpungeOnDelete);
  1969. END;
  1970. INC(i);
  1971. END;
  1972. client.abort := FALSE;
  1973. client.timer.Wakeup();
  1974. END;
  1975. END DeleteMessages;
  1976. PROCEDURE RestoreMessages(sender, data: ANY);
  1977. VAR
  1978. list: Classes.List;
  1979. i, r: LONGINT;
  1980. p: ANY;
  1981. message: IMAPClient.Message;
  1982. BEGIN
  1983. list := data(Classes.List);
  1984. IF list # NIL THEN
  1985. i := 0;
  1986. client.abort := TRUE;
  1987. IF DEBUG THEN KernelLog.String("Restore "); KernelLog.Int(list.GetCount(),0); KernelLog.String(" messages."); KernelLog.Ln(); END;
  1988. WHILE i < list.GetCount() DO
  1989. p := list.GetItem(i);
  1990. message := p(IMAPClient.Message);
  1991. r := client.RestoreMessage(message);
  1992. INC(i);
  1993. END;
  1994. client.abort := FALSE;
  1995. client.timer.Wakeup();
  1996. END;
  1997. END RestoreMessages;
  1998. PROCEDURE Connect;
  1999. VAR user, pass: ARRAY 1000 OF CHAR;
  2000. host: String;
  2001. r: LONGINT;
  2002. BEGIN
  2003. IMAPUtilities.TextToStr(address.text, host);
  2004. IF (host^ = "") THEN
  2005. OutputError("Server not specified");
  2006. RETURN;
  2007. END;
  2008. IMAPUtilities.StringCopy(client.preferences.UserName^, 0, IMAPUtilities.StringLength(client.preferences.UserName^), user);
  2009. IF WMDialogs.QueryString("Enter Username:", user) = WMDialogs.ResOk THEN
  2010. IF WMDialogs.QueryPassword("Enter Password", pass) = WMDialogs.ResOk THEN
  2011. Disconnect();
  2012. r := client.Connect(host^, user, pass);
  2013. END;
  2014. END;
  2015. END Connect;
  2016. PROCEDURE Disconnect;
  2017. BEGIN
  2018. client.abort := TRUE;
  2019. client.Disconnect();
  2020. client.abort := FALSE;
  2021. END Disconnect;
  2022. PROCEDURE Reload;
  2023. BEGIN
  2024. client.applySearchFilter := FALSE;
  2025. client.userAbort := FALSE;
  2026. client.abort := FALSE;
  2027. client.timer.Wakeup();
  2028. END Reload;
  2029. PROCEDURE Abort;
  2030. BEGIN
  2031. client.userAbort := TRUE;
  2032. client.abort := TRUE;
  2033. END Abort;
  2034. PROCEDURE Search;
  2035. VAR
  2036. sw: SearchWindow;
  2037. BEGIN
  2038. IF (client.status # IMAPClient.OK) & (client.status # IMAPClient.OFFLINE) THEN
  2039. OutputError("Search not applicable because Client not connected.");
  2040. RETURN;
  2041. END;
  2042. IF client.currentFolder.Noselect THEN
  2043. OutputError("Search not applicable because Client not in Selected State.");
  2044. RETURN;
  2045. END;
  2046. NEW(sw, SELF);
  2047. END Search;
  2048. PROCEDURE Save;
  2049. VAR
  2050. sw: SaveWindow;
  2051. filename: String;
  2052. doc: XML.Document;
  2053. file: Files.File;
  2054. fw: Files.Writer;
  2055. r: LONGINT;
  2056. BEGIN
  2057. IF (client.status # IMAPClient.ONLINE) & (client.status # IMAPClient.OFFLINE) THEN
  2058. OutputError("Save is not applicable because you are disconnected");
  2059. RETURN;
  2060. END;
  2061. NEW(sw);
  2062. sw.GetAnswer(filename);
  2063. IF filename = NIL THEN
  2064. RETURN;
  2065. END;
  2066. r := client.Save(doc);
  2067. IF DEBUG THEN KernelLog.String("Save finished"); KernelLog.Ln(); END;
  2068. file := Files.New(filename^);
  2069. IF file # NIL THEN
  2070. Files.OpenWriter(fw, file, 0);
  2071. doc.Write(fw, NIL, 0);
  2072. fw.Update();
  2073. Files.Register(file);
  2074. IF DEBUG THEN KernelLog.String("Writing File successful"); KernelLog.Ln(); END;
  2075. ELSE
  2076. OutputError("Writing File failed");
  2077. END;
  2078. END Save;
  2079. PROCEDURE NewSend;
  2080. VAR
  2081. mw: MessageWindow;
  2082. BEGIN
  2083. NEW(mw, SELF);
  2084. mw.NewMessage();
  2085. END NewSend;
  2086. PROCEDURE Expunge;
  2087. VAR
  2088. r: LONGINT;
  2089. BEGIN
  2090. IF client.status = IMAPClient.ONLINE THEN
  2091. r := WMDialogs.Confirmation("Confirm Expunge", "Do you really want to expunge the deleted Messages?");
  2092. IF r = WMDialogs.ResYes THEN
  2093. r := client.Expunge();
  2094. END;
  2095. END;
  2096. END Expunge;
  2097. PROCEDURE DownloadAllMessages;
  2098. BEGIN
  2099. IF client.status # IMAPClient.ONLINE THEN
  2100. OutputError("The client is not online");
  2101. RETURN;
  2102. END;
  2103. client.abort := FALSE;
  2104. client.userAbort := FALSE;
  2105. client.Task := IMAPClient.TLoadAllMessages;
  2106. client.timer.Wakeup();
  2107. END DownloadAllMessages;
  2108. PROCEDURE SwitchToOffline;
  2109. BEGIN
  2110. client.SwitchToOffline();
  2111. END SwitchToOffline;
  2112. PROCEDURE SwitchToOnline;
  2113. VAR
  2114. pass: ARRAY 1000 OF CHAR;
  2115. BEGIN
  2116. IF DEBUG THEN KernelLog.String("GUI: switch to online"); KernelLog.Ln(); END;
  2117. IF WMDialogs.QueryPassword("Enter Password", pass) = WMDialogs.ResOk THEN
  2118. client.SwitchToOnline(pass);
  2119. END;
  2120. END SwitchToOnline;
  2121. PROCEDURE Load;
  2122. VAR
  2123. lw: LoadWindow;
  2124. filename: String;
  2125. offline: BOOLEAN;
  2126. file: Files.File;
  2127. fr: Files.Reader;
  2128. string: String;
  2129. r: LONGINT;
  2130. scanner: XMLScanner.Scanner;
  2131. parser: XMLParser.Parser;
  2132. document: XML.Document;
  2133. element: XML.Element;
  2134. server, user: String;
  2135. pass: ARRAY 1000 OF CHAR;
  2136. BEGIN
  2137. NEW(lw);
  2138. lw.GetAnswer(filename, offline);
  2139. IF filename # NIL THEN
  2140. IF DEBUG THEN KernelLog.String("start loading"); KernelLog.Ln(); END;
  2141. Disconnect();
  2142. file := Files.Old(filename^);
  2143. IF file # NIL THEN
  2144. IF DEBUG THEN KernelLog.String("start scanning and parsing..."); KernelLog.Ln(); END;
  2145. Files.OpenReader(fr, file, 0);
  2146. NEW(scanner, fr);
  2147. NEW(parser, scanner);
  2148. document := parser.Parse();
  2149. element := document.GetRoot();
  2150. string := element.GetName();
  2151. IF string^ # "account" THEN
  2152. OutputError("The file is not compatible it doesn't start with the account tag");
  2153. RETURN;
  2154. END;
  2155. IF offline THEN
  2156. Disconnect();
  2157. r := client.Load(document);
  2158. RefreshDisplay();
  2159. ELSE
  2160. IF WMDialogs.QueryPassword("Enter Password", pass) = WMDialogs.ResOk THEN
  2161. Disconnect();
  2162. r := client.Load(document);
  2163. IF r = IMAPClient.OK THEN
  2164. server := client.preferences.IMAPServer;
  2165. user := client.preferences.UserName;
  2166. r := client.Connect(server^, user^, pass);
  2167. IF DEBUG THEN KernelLog.String("CONNECT RETURN = "); KernelLog.Int(r,0); KernelLog.Ln(); END;
  2168. IMAPUtilities.SetEditorText(address, server);
  2169. END;
  2170. RefreshDisplay();
  2171. END;
  2172. END;
  2173. ELSE
  2174. OutputError("Reading the file failed.");
  2175. END;
  2176. END;
  2177. END Load;
  2178. PROCEDURE SetPreferences;
  2179. VAR
  2180. pw: PreferencesWindow;
  2181. BEGIN
  2182. NEW(pw, SELF);
  2183. END SetPreferences;
  2184. PROCEDURE Handle*(VAR x: WMMessages.Message);
  2185. BEGIN
  2186. IF (x.msgType = WMMessages.MsgExt) & (x.ext # NIL) THEN
  2187. IF(x.ext IS KillerMsg) THEN
  2188. Close();
  2189. ELSIF (x.ext IS WMRestorable.Storage) THEN
  2190. x.ext(WMRestorable.Storage).Add("Window", "IMAPGUI.Restore", SELF, NIL);
  2191. ELSE
  2192. Handle^(x);
  2193. END;
  2194. ELSE
  2195. Handle^(x);
  2196. END;
  2197. END Handle;
  2198. PROCEDURE Close*;
  2199. BEGIN
  2200. client.abort := TRUE;
  2201. client.Close();
  2202. active := FALSE;
  2203. timer.Wakeup();
  2204. Close^;
  2205. DecCount();
  2206. END Close;
  2207. PROCEDURE DisplayCurrentFolder;
  2208. BEGIN
  2209. UpdateFolders();
  2210. UpdateMessages();
  2211. UpdateStatusLabels();
  2212. END DisplayCurrentFolder;
  2213. (* updates all the labels (statusLabel, currentFolderLabel, currentMessagesLabel) *)
  2214. PROCEDURE UpdateStatusLabels;
  2215. VAR
  2216. status, currentWork, nofMessages: LONGINT;
  2217. buffer: Strings.Buffer;
  2218. w: Streams.Writer;
  2219. string: String;
  2220. BEGIN
  2221. (* currentFolderLabel *)
  2222. NEW(buffer, 16);
  2223. w := buffer.GetWriter();
  2224. w.String("Current Folder: ");
  2225. IF IMAPUtilities.StringLength(client.currentFolder.path^) # 0 THEN
  2226. w.String(client.currentFolder.path^);
  2227. w.Char(client.currentFolder.hierarchyDelimiter);
  2228. END;
  2229. w.String(client.currentFolder.name^);
  2230. string := buffer.GetString();
  2231. currentFolderLabel.caption.SetAOC(string^);
  2232. (* currentMessagesLabel *)
  2233. NEW(buffer, 16);
  2234. w := buffer.GetWriter();
  2235. w.String("Current Messages: ");
  2236. messageGrid.model.Acquire;
  2237. nofMessages := messageGrid.model.GetNofRows() - 1;
  2238. IF client.currentFolder.Noselect THEN
  2239. nofMessages := 0;
  2240. END;
  2241. w.Int(nofMessages, 0);
  2242. messageGrid.model.Release;
  2243. string := buffer.GetString();
  2244. currentMessagesLabel.caption.SetAOC(string^);
  2245. (* statusLabel *)
  2246. status := client.status;
  2247. currentWork := client.currentWork;
  2248. NEW(buffer, 16);
  2249. w := buffer.GetWriter();
  2250. w.String("Status: ");
  2251. IF client.status = IMAPClient.ONLINE THEN
  2252. w.String("online. ");
  2253. ELSIF client.status = IMAPClient.OFFLINE THEN
  2254. w.String("offline. ");
  2255. ELSE
  2256. w.String("disconnected. ");
  2257. END;
  2258. IF (status = IMAPClient.ONLINE) OR (status = IMAPClient.OFFLINE) THEN
  2259. w.String("Current Work: ");
  2260. IF currentWork = IMAPClient.CWFINISHED THEN
  2261. w.String("Finished");
  2262. ELSIF currentWork = IMAPClient.CWCONNECTING THEN
  2263. w.String("Connecting...");
  2264. ELSIF currentWork = IMAPClient.CWLOADING THEN
  2265. w.String("Loading...");
  2266. ELSIF currentWork = IMAPClient.CWCREATING THEN
  2267. w.String("Creating Mailbox...");
  2268. ELSIF currentWork = IMAPClient.CWRENAMING THEN
  2269. w.String("Renaming Mailbox...");
  2270. ELSIF currentWork = IMAPClient.CWDELETINGFOLDER THEN
  2271. w.String("Deleting Mailbox...");
  2272. ELSIF currentWork = IMAPClient.CWSEARCHING THEN
  2273. w.String("Searching...");
  2274. ELSIF currentWork = IMAPClient.CWCOPYING THEN
  2275. w.String("Copying Message...");
  2276. ELSIF currentWork = IMAPClient.CWDELETINGMESSAGE THEN
  2277. w.String("Deleting Message...");
  2278. ELSIF currentWork = IMAPClient.CWAPPENDING THEN
  2279. w.String("Saving Message...");
  2280. ELSIF currentWork = IMAPClient.CWCLOSING THEN
  2281. w.String("Closing Client...");
  2282. ELSIF currentWork = IMAPClient.CWSAVINGACCOUNT THEN
  2283. w.String("Saving Account...");
  2284. ELSIF currentWork = IMAPClient.CWLOADINGACCOUNT THEN
  2285. w.String("Loading Account...");
  2286. ELSIF currentWork = IMAPClient.CWPOLLING THEN
  2287. w.String("Polling...");
  2288. ELSIF currentWork = IMAPClient.CWEXPUNGING THEN
  2289. w.String("Expunging...");
  2290. ELSIF currentWork = IMAPClient.CWRESTORING THEN
  2291. w.String("Restoring...");
  2292. END;
  2293. END;
  2294. string := buffer.GetString();
  2295. statusLabel.caption.SetAOC(string^);
  2296. END UpdateStatusLabels;
  2297. PROCEDURE UpdateFolders;
  2298. VAR
  2299. root: WMTrees.TreeNode;
  2300. i: LONGINT;
  2301. p: ANY;
  2302. folder: IMAPClient.Folder;
  2303. state: SET;
  2304. PROCEDURE UpdateSub(parent: WMTrees.TreeNode; folder:IMAPClient.Folder);
  2305. VAR
  2306. node, child: WMTrees.TreeNode;
  2307. i: LONGINT;
  2308. sub: ANY;
  2309. subFolder: IMAPClient.Folder;
  2310. childData: ANY;
  2311. childFolder: IMAPClient.Folder;
  2312. present: BOOLEAN;
  2313. name: String;
  2314. BEGIN
  2315. (* check if already present *)
  2316. present := FALSE;
  2317. child := tree.GetChildren(parent);
  2318. WHILE (child # NIL) & (present = FALSE) DO
  2319. childData := tree.GetNodeData(child);
  2320. childFolder := childData(IMAPClient.Folder);
  2321. IF childFolder = folder THEN
  2322. present := TRUE;
  2323. node := child;
  2324. END;
  2325. child := tree.GetNextSibling(child);
  2326. END;
  2327. (* add if not present *)
  2328. IF present = FALSE THEN
  2329. NEW(node);
  2330. tree.AddChildNode(parent, node);
  2331. name := IMAPUtilities.NewString(folder.name^);
  2332. IMAPUtilities.replaceEncodedFolderName(name);
  2333. tree.SetNodeCaption(node, name);
  2334. tree.SetNodeData(node, folder);
  2335. END;
  2336. (* add Subfolders *)
  2337. i := 0;
  2338. WHILE i < folder.children.GetCount() DO
  2339. sub := folder.children.GetItem(i);
  2340. subFolder := sub(IMAPClient.Folder);
  2341. UpdateSub(node, subFolder);
  2342. INC(i);
  2343. END;
  2344. (* remove nodes that don't have a folder in the client's folderstructure anymore *)
  2345. RemoveOldSubNodes(node);
  2346. END UpdateSub;
  2347. PROCEDURE RemoveOldSubNodes(node: WMTrees.TreeNode);
  2348. VAR
  2349. child, nextSibling: WMTrees.TreeNode;
  2350. childFolder: IMAPClient.Folder;
  2351. p: ANY;
  2352. folder: IMAPClient.Folder;
  2353. subFolders: Classes.List;
  2354. subFolder: IMAPClient.Folder;
  2355. i: LONGINT;
  2356. found: BOOLEAN;
  2357. BEGIN
  2358. p := tree.GetNodeData(node);
  2359. folder := p(IMAPClient.Folder);
  2360. subFolders:= folder.children;
  2361. child := tree.GetChildren(node);
  2362. WHILE child # NIL DO
  2363. p := tree.GetNodeData(child);
  2364. childFolder := p(IMAPClient.Folder);
  2365. found := FALSE;
  2366. (* search corresponding folder *)
  2367. i := 0;
  2368. WHILE (i < subFolders.GetCount()) & ~found DO
  2369. p := subFolders.GetItem(i);
  2370. subFolder := p(IMAPClient.Folder);
  2371. IF subFolder = childFolder THEN
  2372. found := TRUE;
  2373. END;
  2374. INC(i);
  2375. END;
  2376. nextSibling := tree.GetNextSibling(child);
  2377. IF ~found THEN
  2378. tree.RemoveNode(child);
  2379. END;
  2380. child := nextSibling;
  2381. END;
  2382. END RemoveOldSubNodes;
  2383. BEGIN
  2384. tree.Acquire();
  2385. root := tree.GetRoot();
  2386. tree.SetNodeData(root, client.mailboxContent);
  2387. state := {WMTrees.NodeAlwaysExpanded};
  2388. tree.SetNodeState(root, state);
  2389. i := 0;
  2390. WHILE i < client.mailboxContent.children.GetCount() DO
  2391. p := client.mailboxContent.children.GetItem(i);
  2392. folder := p(IMAPClient.Folder);
  2393. UpdateSub(root, folder);
  2394. INC(i);
  2395. END;
  2396. RemoveOldSubNodes(root);
  2397. tree.Release();
  2398. END UpdateFolders;
  2399. PROCEDURE UpdateMessages;
  2400. VAR
  2401. i, count: LONGINT;
  2402. message: IMAPClient.Message;
  2403. messageP: ANY;
  2404. header: IMAPClient.HeaderElement;
  2405. list: Classes.List;
  2406. address: IMAPUtilities.Address;
  2407. addressP: ANY;
  2408. buffer: Strings.Buffer;
  2409. w: Streams.Writer;
  2410. string: String;
  2411. bResizeGrid: BOOLEAN;
  2412. sortedList: Classes.SortedList;
  2413. PROCEDURE Display(row: LONGINT; message: IMAPClient.Message);
  2414. BEGIN
  2415. IF message.header # NIL THEN
  2416. list := message.header.from;
  2417. IF list # NIL THEN
  2418. IF list.GetCount() > 0 THEN
  2419. addressP := list.GetItem(0);
  2420. address := addressP(IMAPUtilities.Address);
  2421. IF address.realName^ # "" THEN
  2422. IMAPUtilities.replaceEncodedHeaderWord(address.realName^);
  2423. string := IMAPUtilities.NewString(address.realName^);
  2424. ELSE
  2425. NEW(buffer, 16);
  2426. w := buffer.GetWriter();
  2427. w.String("<");
  2428. w.String(address.namePart^);
  2429. w.String("@");
  2430. w.String(address.domainPart^);
  2431. w.String(">");
  2432. string := buffer.GetString();
  2433. END;
  2434. ELSE
  2435. string := Strings.NewString("");
  2436. END;
  2437. ELSE
  2438. string := Strings.NewString("");
  2439. END;
  2440. messageGrid.model.SetCellText(0, row+1, string);
  2441. IF message.flags.deleted THEN
  2442. messageGrid.model.SetCellImage(0, row+1, IconDeleted);
  2443. ELSE
  2444. IF ~message.flags.seen THEN
  2445. messageGrid.model.SetCellImage(0, row+1, IconUnread);
  2446. ELSE
  2447. IF message.flags.answered THEN
  2448. messageGrid.model.SetCellImage(0, row+1, IconAnswered);
  2449. ELSE
  2450. messageGrid.model.SetCellImage(0, row+1, IconRead);
  2451. END;
  2452. END;
  2453. END;
  2454. messageGrid.model.SetCellData(0, row+1, message);
  2455. IF message.header.subject # NIL THEN
  2456. IMAPUtilities.replaceEncodedHeaderWord(message.header.subject^);
  2457. string := Strings.NewString(message.header.subject^);
  2458. messageGrid.model.SetCellText(1, row+1, string);
  2459. messageGrid.model.SetCellData(1, row+1, message);
  2460. END;
  2461. IF message.internalDate # NIL THEN
  2462. messageGrid.model.SetCellText(2, row+1, Strings.NewString(message.internalDate^));
  2463. messageGrid.model.SetCellData(2, row+1, message);
  2464. END;
  2465. NEW(buffer, 16);
  2466. w := buffer.GetWriter();
  2467. w.Int(message.size,0);
  2468. string := buffer.GetString();
  2469. messageGrid.model.SetCellText(3, row+1, string);
  2470. messageGrid.model.SetCellData(3, row+1, message);
  2471. END;
  2472. END Display;
  2473. BEGIN
  2474. bResizeGrid := FALSE;
  2475. IF client.currentFolder.Noselect THEN
  2476. messageGrid.model.Acquire;
  2477. IF messageGrid.model.GetNofCols() # 1 THEN
  2478. bResizeGrid := TRUE;
  2479. NEW(colWidths, 1);
  2480. messageGrid.model.SetNofRows(2);
  2481. messageGrid.model.SetNofCols(1);
  2482. messageGrid.model.SetCellText(0, 0, Strings.NewString(""));
  2483. messageGrid.model.SetCellData(0, 0, NIL);
  2484. messageGrid.model.SetCellImage(0, 1, NIL);
  2485. messageGrid.model.SetCellText(0, 1, Strings.NewString("This Mailbox is not selectable and does not contain any mail."));
  2486. messageGrid.model.SetCellData(0, 1, NIL);
  2487. END;
  2488. messageGrid.model.Release;
  2489. ELSE
  2490. messageGrid.model.Acquire;
  2491. IF messageGrid.model.GetNofCols() # 4 THEN
  2492. bResizeGrid := TRUE;
  2493. NEW(colWidths, 4);
  2494. messageGrid.model.SetNofCols(4); (* From, Subject, Date, Size *)
  2495. messageGrid.model.SetNofRows(1);
  2496. messageGrid.model.SetCellText(0, 0, Strings.NewString("From"));
  2497. messageGrid.model.SetCellData(0, 0, NIL);
  2498. messageGrid.model.SetCellText(1, 0, Strings.NewString("Subject"));
  2499. messageGrid.model.SetCellData(1, 0, NIL);
  2500. messageGrid.model.SetCellText(2, 0, Strings.NewString("Date"));
  2501. messageGrid.model.SetCellData(2, 0, NIL);
  2502. messageGrid.model.SetCellText(3, 0, Strings.NewString("Size"));
  2503. messageGrid.model.SetCellData(3, 0, NIL);
  2504. messageGrid.bounds.SetHeight(messageGrid.bounds.GetHeight()-20);
  2505. END;
  2506. messageGrid.model.Release;
  2507. NEW(sortedList, IMAPClient.OldestFirst);
  2508. IF client.applySearchFilter = TRUE THEN
  2509. i := LEN(client.searchResult) -1;
  2510. WHILE i >= 0 DO
  2511. messageP := client.currentFolder.messages.GetItem(client.searchResult[i]);
  2512. message := messageP(IMAPClient.Message);
  2513. sortedList.Add(message);
  2514. DEC(i);
  2515. END;
  2516. ELSE
  2517. i := client.currentFolder.messages.GetCount() - 1;
  2518. WHILE i >= 0 DO
  2519. messageP := client.currentFolder.messages.GetItem(i);
  2520. message := messageP(IMAPClient.Message);
  2521. sortedList.Add(message);
  2522. DEC(i);
  2523. END;
  2524. END;
  2525. i := 0;
  2526. count := 0;
  2527. messageGrid.model.Acquire;
  2528. IF sortedList.GetCount() = 0 THEN
  2529. bResizeGrid := TRUE;
  2530. messageGrid.model.SetNofRows(1);
  2531. IF DEBUG THEN KernelLog.String("keine Nachrichten"); KernelLog.Ln(); END;
  2532. END;
  2533. WHILE i < sortedList.GetCount() DO
  2534. messageP := sortedList.GetItem(i);
  2535. message := messageP(IMAPClient.Message);
  2536. header := message.header;
  2537. IF (header # NIL) THEN
  2538. messageGrid.model.SetNofRows(count + 2);
  2539. Display(count, message);
  2540. INC(count);
  2541. END;
  2542. INC(i);
  2543. END;
  2544. messageGrid.model.Release;
  2545. END;
  2546. IF bResizeGrid THEN ResizeGrid(); END;
  2547. END UpdateMessages;
  2548. PROCEDURE RefreshDisplay;
  2549. BEGIN
  2550. updateFlag := TRUE;
  2551. timer.Wakeup();
  2552. END RefreshDisplay;
  2553. BEGIN {ACTIVE} (* keepalive *)
  2554. NEW(timer);
  2555. WHILE active DO
  2556. timer.Sleep(REFRESHTIME);
  2557. IF DEBUG THEN KernelLog.String("+"); END;
  2558. IF (client.status = IMAPClient.DISCONNECTED) OR (client.status = IMAPClient.DEAD) THEN
  2559. UpdateFolders();
  2560. messageGrid.model.Acquire;
  2561. NEW(colWidths, 1);
  2562. colWidths[0] := messageGrid.bounds.GetWidth();
  2563. messageGrid.SetColSpacings(colWidths);
  2564. messageGrid.model.SetNofRows(1);
  2565. messageGrid.model.SetNofCols(1);
  2566. messageGrid.model.SetCellText(0, 0, Strings.NewString(""));
  2567. messageGrid.model.Release;
  2568. UpdateStatusLabels();
  2569. ELSE
  2570. WHILE updateFlag DO
  2571. IF DEBUG THEN KernelLog.Ln(); END;
  2572. updateFlag := FALSE;
  2573. DisplayCurrentFolder();
  2574. END;
  2575. END;
  2576. END (* WHILE *);
  2577. IF DEBUG THEN KernelLog.String("Window Activity finished-------------------------------------------------------------------"); KernelLog.Ln(); END;
  2578. END Window;
  2579. PROCEDURE OutputError(CONST error: ARRAY OF CHAR);
  2580. BEGIN
  2581. WMDialogs.Error(WindowTitle, error);
  2582. END OutputError;
  2583. PROCEDURE Open*;
  2584. VAR w: Window;
  2585. BEGIN
  2586. NEW(w, NIL);
  2587. END Open;
  2588. PROCEDURE Restore*(context : WMRestorable.Context);
  2589. VAR w : Window;
  2590. BEGIN
  2591. NEW(w, context);
  2592. END Restore;
  2593. PROCEDURE IncCount;
  2594. BEGIN {EXCLUSIVE}
  2595. INC(nofWindows);
  2596. END IncCount;
  2597. PROCEDURE DecCount;
  2598. BEGIN {EXCLUSIVE}
  2599. DEC(nofWindows);
  2600. END DecCount;
  2601. PROCEDURE Cleanup;
  2602. VAR
  2603. die: KillerMsg;
  2604. msg: WMMessages.Message;
  2605. m: WMWindowManager.WindowManager;
  2606. BEGIN {EXCLUSIVE}
  2607. NEW(die);
  2608. msg.ext := die;
  2609. msg.msgType := WMMessages.MsgExt;
  2610. m := WMWindowManager.GetDefaultManager();
  2611. m.Broadcast(msg);
  2612. AWAIT(nofWindows = 0);
  2613. END Cleanup;
  2614. BEGIN
  2615. Modules.InstallTermHandler(Cleanup);
  2616. END IMAPGUI.
  2617. IMAPGUI.Open ~
  2618. AosTools.FreeDownTo IMAPUtilities~