2
0

DTPImage.Mod 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. MODULE DTPImage; (** AUTHOR "PL"; PURPOSE "Simple Image Plugin Component"; *)
  2. IMPORT
  3. Modules, Files, XML,
  4. WMStandardComponents, WMGraphics,
  5. WMComponents, WMRectangles, WMDialogs,
  6. WMEditors, Strings, XMLObjects,
  7. WMWindowManager, Raster, WMRasterScale,
  8. DTPEditor, DTPData; (* DTPFrame *)
  9. CONST
  10. pluginVersion = 1.00;
  11. pluginName = "Image";
  12. pluginDesc = "Loads an Image from the given Filename";
  13. VAR
  14. TYPE
  15. ImageObject* = OBJECT(DTPData.ContentObject);
  16. VAR ownerDocument: DTPData.Document;
  17. ownerPage: DTPData.PageObject;
  18. ownerFrame: DTPData.FrameObject;
  19. done: BOOLEAN;
  20. img: Raster.Image;
  21. filename: ARRAY 128 OF CHAR;
  22. properties: ImagePropWindow;
  23. PROCEDURE &New*;
  24. BEGIN
  25. done := FALSE;
  26. NEW(properties, SELF);
  27. END New;
  28. PROCEDURE Draw*(canvas : WMGraphics.Canvas; x, y, w, h : LONGINT; zoomFactor: REAL; quality, preview: BOOLEAN);
  29. VAR mode: LONGINT;
  30. BEGIN
  31. IF ~quality THEN
  32. mode := WMRasterScale.ScaleBox;
  33. ELSE
  34. mode := WMRasterScale.ScaleBilinear;
  35. END;
  36. IF done THEN
  37. canvas.ScaleImage(img, WMRectangles.MakeRect(0,0, img.width, img.height), WMRectangles.MakeRect(x, y, x+w+1, y+h+1), WMRasterScale.ModeSrcOverDst, mode);
  38. END;
  39. END Draw;
  40. PROCEDURE Clone*(): DTPData.ContentObject; (* clone all the current properties *)
  41. VAR newObj: ImageObject;
  42. done: BOOLEAN;
  43. BEGIN
  44. NEW(newObj); newObj.contentName := Strings.NewString(contentName^);
  45. newObj.redrawProc := redrawProc; newObj.updatePropsPosition := updatePropsPosition;
  46. newObj.contentWidth := contentWidth; newObj.contentHeight := contentHeight; newObj.zoomFactor := zoomFactor;
  47. newObj.ownerDoc := ownerDoc;
  48. (* plugin specific clones *)
  49. NEW(newObj.img); newObj.img := WMGraphics.LoadImage(filename, FALSE);
  50. IF newObj.img # NIL THEN
  51. newObj.done := done;
  52. newObj.filename := filename;
  53. END;
  54. RETURN newObj;
  55. END Clone;
  56. PROCEDURE LoadImg(CONST file: ARRAY OF CHAR);
  57. BEGIN
  58. NEW(img); done := FALSE;
  59. img := WMGraphics.LoadImage(file, FALSE);
  60. (* Raster.Load(img, file, done);
  61. IF done THEN
  62. *) IF img # NIL THEN
  63. COPY(file, filename);
  64. done := TRUE;
  65. ELSE
  66. filename := "none";
  67. END;
  68. END LoadImg;
  69. PROCEDURE Load*(elem: XML.Element);
  70. VAR name : Strings.String;
  71. cont: XMLObjects.Enumerator;
  72. ptr: ANY;
  73. BEGIN
  74. cont := elem.GetContents(); cont.Reset();
  75. WHILE cont.HasMoreElements() DO
  76. ptr := cont.GetNext();
  77. IF ptr IS XML.Element THEN (* read attributes *)
  78. name := ptr(XML.Element).GetAttributeValue("name");
  79. IF (name # NIL) & (name^ = "file") THEN
  80. name := ptr(XML.Element).GetAttributeValue("value");
  81. IF (name # NIL) THEN
  82. LoadImg(name^);
  83. END;
  84. END;
  85. END;
  86. END;
  87. END Load;
  88. PROCEDURE Store*(VAR w: Files.Writer);
  89. BEGIN
  90. w.String(' <node-attribute name="type" value="Image" />'); w.Ln;
  91. w.String(' <node-attribute name="file" value="'); w.String(filename); w.String('" />'); w.Ln;
  92. END Store;
  93. PROCEDURE OnCreate*;
  94. VAR filename: ARRAY 128 OF CHAR;
  95. BEGIN
  96. filename := "tux.bmp";
  97. IF WMDialogs.QueryString("Load Image:", filename) = WMDialogs.ResOk THEN
  98. LoadImg(filename);
  99. END;
  100. END OnCreate;
  101. PROCEDURE Redraw*;
  102. BEGIN
  103. Redraw^;
  104. END Redraw;
  105. PROCEDURE Show*(x, y: LONGINT);
  106. BEGIN
  107. properties.Show(x, y);
  108. END Show;
  109. PROCEDURE Hide*;
  110. VAR viewport: WMWindowManager.ViewPort;
  111. BEGIN
  112. viewport := WMWindowManager.GetDefaultView();
  113. UpdatePosition(properties.bounds.l-ENTIER(viewport.range.l), properties.bounds.t-ENTIER(viewport.range.t));
  114. properties.Hide;
  115. END Hide;
  116. PROCEDURE Close*;
  117. BEGIN
  118. Hide;
  119. END Close;
  120. END ImageObject;
  121. ImagePropWindow = OBJECT(WMComponents.FormWindow)
  122. VAR theCaller : ImageObject;
  123. shown: BOOLEAN;
  124. leftPanel, rightPanel: WMStandardComponents.Panel;
  125. fileEdit: WMEditors.Editor;
  126. PROCEDURE &New*(caller: ImageObject);
  127. VAR vc: WMComponents.VisualComponent;
  128. BEGIN
  129. theCaller := caller;
  130. manager := WMWindowManager.GetDefaultManager();
  131. vc := CreatePropertyForm();
  132. Init(vc.bounds.GetWidth(), vc.bounds.GetHeight(), TRUE);
  133. SetContent(vc);
  134. SetTitle(Strings.NewString("Content"));
  135. shown := FALSE;
  136. END New;
  137. PROCEDURE CreatePropertyForm(): WMComponents.VisualComponent;
  138. VAR panel: WMStandardComponents.Panel;
  139. label: WMStandardComponents.Label;
  140. windowStyle : WMWindowManager.WindowStyle;
  141. panelColor : LONGINT;
  142. BEGIN
  143. windowStyle := manager.GetStyle();
  144. panelColor := windowStyle.bgColor;
  145. NEW(panel); panel.bounds.SetExtents(190 , 60); panel.fillColor.Set(panelColor);
  146. panel.takesFocus.Set(TRUE);
  147. NEW(leftPanel); leftPanel.bounds.SetWidth(90); leftPanel.alignment.Set(WMComponents.AlignLeft);
  148. panel.AddContent(leftPanel);
  149. NEW(rightPanel); rightPanel.alignment.Set(WMComponents.AlignClient);
  150. panel.AddContent(rightPanel);
  151. NEW(label); label.bounds.SetHeight(20); label.alignment.Set(WMComponents.AlignTop);
  152. label.SetCaption(" Filename:"); label.textColor.Set(0000000FFH);
  153. leftPanel.AddContent(label);
  154. NEW(fileEdit); fileEdit.bounds.SetHeight(20); fileEdit.alignment.Set(WMComponents.AlignTop);
  155. fileEdit.tv.showBorder.Set(TRUE); fileEdit.multiLine.Set(FALSE); fileEdit.fillColor.Set(0FFFFFFFFH);
  156. fileEdit.tv.textAlignV.Set(WMGraphics.AlignCenter);
  157. fileEdit.onEnter.Add(SetValueHandler); fileEdit.tv.borders.Set(WMRectangles.MakeRect(3,3,1,1));
  158. fileEdit.SetAsString(theCaller.filename);
  159. rightPanel.AddContent(fileEdit);
  160. RETURN panel;
  161. END CreatePropertyForm;
  162. PROCEDURE Show*(x, y: LONGINT);
  163. BEGIN
  164. IF ~shown THEN
  165. shown := TRUE;
  166. RefreshValues;
  167. WMWindowManager.ExtAddWindow(SELF, x, y,
  168. {WMWindowManager.FlagFrame, WMWindowManager.FlagStayOnTop, WMWindowManager.FlagClose, WMWindowManager.FlagMinimize});
  169. END;
  170. END Show;
  171. PROCEDURE Hide*;
  172. BEGIN
  173. IF shown THEN
  174. shown := FALSE;
  175. manager.Remove(SELF);
  176. END;
  177. END Hide;
  178. PROCEDURE RefreshValues;
  179. BEGIN
  180. fileEdit.SetAsString(theCaller.filename);
  181. fileEdit.Invalidate;
  182. END RefreshValues;
  183. PROCEDURE SetValueHandler(sender, data: ANY);
  184. VAR
  185. file : ARRAY 128 OF CHAR;
  186. BEGIN
  187. (* COPY(theCaller.filename, file); *)
  188. IF (sender = fileEdit) THEN
  189. fileEdit.GetAsString(file);
  190. IF file # theCaller.filename THEN (* load new picture *)
  191. theCaller.LoadImg(file);
  192. theCaller.Redraw;
  193. RefreshValues;
  194. END;
  195. END;
  196. END SetValueHandler;
  197. PROCEDURE Close*;
  198. BEGIN
  199. shown := FALSE;
  200. Hide;
  201. Close^;
  202. END Close;
  203. END ImagePropWindow;
  204. PROCEDURE GenImage*(): DTPData.ContentObject;
  205. VAR image: ImageObject;
  206. BEGIN
  207. NEW(image);
  208. RETURN image;
  209. END GenImage;
  210. PROCEDURE Register*;
  211. BEGIN
  212. DTPEditor.plugRegistry.RegisterPlugin(pluginName, GenImage);
  213. END Register;
  214. PROCEDURE Cleanup;
  215. BEGIN
  216. DTPEditor.plugRegistry.UnregisterPlugin(pluginName);
  217. END Cleanup;
  218. BEGIN
  219. Modules.InstallTermHandler(Cleanup);
  220. END DTPImage.
  221. ---------------------------------
  222. SystemTools.Free DTPImage