fphelp.pas 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515
  1. {
  2. $Id$
  3. This file is part of the Free Pascal Integrated Development Environment
  4. Copyright (c) 1998 by Berczi Gabor
  5. Help routines for the IDE
  6. See the file COPYING.FPC, included in this distribution,
  7. for details about the copyright.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. **********************************************************************}
  12. unit FPHelp;
  13. interface
  14. uses
  15. Drivers,
  16. {$ifdef FVISION}
  17. FVConsts,
  18. {$else}
  19. Commands,HelpCtx,
  20. {$endif}
  21. WHelp,WHlpView,WHTML,
  22. WEditor,WCEdit,
  23. WViews,WHTMLScn,
  24. FPViews;
  25. type
  26. PIDEStatusLine = ^TIDEStatusLine;
  27. TIDEStatusLine = object(TAdvancedStatusLine)
  28. function Hint(AHelpCtx: Word): String; virtual;
  29. procedure HandleEvent(var Event: TEvent); virtual;
  30. end;
  31. PFPHTMLFileLinkScanner = ^TFPHTMLFileLinkScanner;
  32. TFPHTMLFileLinkScanner = object(THTMLFileLinkScanner)
  33. function CheckURL(const URL: string): boolean; virtual;
  34. function CheckText(const Text: string): boolean; virtual;
  35. procedure ProcessDoc(Doc: PHTMLLinkScanFile); virtual;
  36. end;
  37. procedure Help(FileID, Context: THelpCtx; Modal: boolean);
  38. procedure HelpIndex(Keyword: string);
  39. procedure HelpTopicSearch(Editor: PEditor);
  40. procedure HelpTopic(const S: string);
  41. procedure CloseHelpWindows;
  42. procedure InitHelpSystem;
  43. procedure DoneHelpSystem;
  44. procedure InitHelpFiles;
  45. procedure DoneHelpFiles;
  46. procedure CheckHelpSystem;
  47. procedure PushStatus(S: string);
  48. procedure SetStatus(S: string);
  49. procedure ClearStatus;
  50. procedure PopStatus;
  51. const
  52. HelpWindow : PFPHelpWindow = nil;
  53. HelpInited : boolean = false;
  54. implementation
  55. uses Objects,Views,App,MsgBox,
  56. WUtils,WOAHelp,WHTMLHlp,WNGHelp,WOS2Help,WVPHelp,WWinHelp,
  57. FPString,FPConst,FPVars,FPUtils;
  58. const
  59. MaxStatusLevel = {$ifdef FPC}10{$else}1{$endif};
  60. var StatusStack : array[0..MaxStatusLevel] of string[MaxViewWidth];
  61. const
  62. StatusStackPtr : integer = 0;
  63. procedure TIDEStatusLine.HandleEvent(var Event: TEvent);
  64. begin
  65. case Event.What of
  66. evBroadcast :
  67. case Event.Command of
  68. cmUpdate : Update;
  69. end;
  70. end;
  71. inherited HandleEvent(Event);
  72. end;
  73. function TIDEStatusLine.Hint(AHelpCtx: Word): String;
  74. var S: string;
  75. begin
  76. case AHelpCtx of
  77. hcNoContext : S:='';
  78. hcDragging : S:='';
  79. hcSourceWindow : S:='';
  80. hcHelpWindow : S:='';
  81. hcCalcWindow : S:='';
  82. hcInfoWindow : S:='';
  83. hcClipboardWindow:S:='';
  84. hcBrowserWindow : S:='';
  85. hcMessagesWindow: S:='';
  86. hcCompilerMessagesWindow: S:='';
  87. hcASCIITableWindow: S:='';
  88. hcGDBWindow : S:=hint_rawgdbwindow;
  89. hcDisassemblyWindow : S:=hint_disassemblywindow;
  90. hcBreakpointListWindow : S:=hint_allbreakpoints;
  91. hcSystemMenu : S:=hint_systemmenu;
  92. hcUpdate : S:=hint_update;
  93. hcAbout : S:=hint_about;
  94. hcFileMenu : S:=hint_filemenu;
  95. hcNew : S:=hint_filenew;
  96. hcNewFromTemplate:S:=hint_filenewfromtemplate;
  97. hcOpen : S:=hint_fileopen;
  98. hcSave : S:=hint_filesave;
  99. hcSaveAs : S:=hint_filesaveas;
  100. hcSaveAll : S:=hint_filesaveall;
  101. hcChangeDir : S:=hint_changedir;
  102. hcDOSShell : S:=hint_dosshell;
  103. hcQuit : S:=hint_exit;
  104. hcRecentFileBase..hcRecentFileBase+10
  105. : S:=hint_openrecentfile;
  106. hcEditMenu : S:=hint_editmenu;
  107. hcUndo : S:=hint_editundo;
  108. hcRedo : S:=hint_editredo;
  109. hcCut : S:=hint_editcut;
  110. hcCopy : S:=hint_editcopy;
  111. hcPaste : S:=hint_editpaste;
  112. hcCopyWin : S:=hint_editcopywin;
  113. hcPasteWin : S:=hint_editpastewin;
  114. hcClear : S:=hint_editclear;
  115. hcShowClipboard : S:=hint_showclipboard;
  116. hcSearchMenu : S:=hint_searchmenu;
  117. hcFind : S:=hint_searchfind;
  118. hcReplace : S:=hint_searchreplace;
  119. hcSearchAgain : S:=hint_searchagain;
  120. hcGotoLine : S:=hint_gotoline;
  121. hcObjects : S:=hint_objects;
  122. hcModules : S:=hint_modules;
  123. hcGlobals : S:=hint_globals;
  124. hcSymbol : S:=hint_symbol;
  125. hcRunMenu : S:=hint_runmenu;
  126. hcRun : S:=hint_run;
  127. hcParameters : S:=hint_runparameters;
  128. hcResetDebugger : S:=hint_resetprogram;
  129. hcContToCursor : S:=hint_rununtilcursor;
  130. hcUntilReturn : S:=hint_rununtilreturn;
  131. hcUserScreen : S:=hint_userscreen;
  132. hcCompileMenu : S:=hint_compilemenu;
  133. hcCompile : S:=hint_compile;
  134. hcMake : S:=hint_make;
  135. hcBuild : S:=hint_build;
  136. hcTarget : S:=hint_target;
  137. hcPrimaryFile : S:=hint_primaryfile;
  138. hcClearPrimary : S:=hint_clearprimaryfile;
  139. hcInformation : S:=hint_information;
  140. hcCompilerMessages:S:=hint_showmessages;
  141. hcDebugMenu : S:=hint_debugmenu;
  142. hcToggleBreakpoint : S:=hint_togglebreakpoint;
  143. hcNewBreakpoint : S:=hint_createnewbreakpoint;
  144. hcEditBreakpoint : S:=hint_editbreakpoint;
  145. hcDeleteBreakpoint : S:=hint_deletebreakpoint;
  146. hcOpenGDBWindow : S:=hint_opengdbwindow;
  147. hcAddWatch : S:=hint_addwatch;
  148. hcWatchesWindow : S:=hint_watches;
  149. hcStackWindow : S:=hint_callstack;
  150. hcBreakpointList : S:=hint_editbreakpoints;
  151. hcToolsMenu : S:=hint_toolsmenu;
  152. hcCalculator : S:=hint_calculator;
  153. hcGrep : S:=hint_grep;
  154. hcMsgGotoSource : S:=hint_gotosource;
  155. hcRegistersWindow : S:=hint_registers;
  156. hcToolsMessages : S:=hint_messageswindow;
  157. hcToolsBase..
  158. hcToolsBase+MaxToolCount
  159. : S:=hint_usertool;
  160. hcASCIITable : S:=hint_asciitable;
  161. hcOptionsMenu : S:=hint_optionsmenu;
  162. hcSwitchesMode : S:=hint_switchesmode;
  163. hcCompiler,
  164. hcCompilerNoAltX : S:=hint_compiler;
  165. hcMemorySizes : S:=hint_memorysizes;
  166. hcLinker : S:=hint_linkeroptions;
  167. hcDebugger : S:=hint_debugoptions;
  168. hcDirectories : S:=hint_directories;
  169. hcBrowser,
  170. hcBrowserOptions: S:=hint_browser;
  171. hcTools : S:=hint_tools;
  172. hcEnvironmentMenu:S:=hint_environmentmenu;
  173. hcPreferences : S:=hint_preferences;
  174. hcEditor : S:=hint_editoroptions;
  175. hcCodeCompleteOptions:S:=hint_codecomplete;
  176. hcCodeTemplateOptions:S:=hint_codetemplates;
  177. hcMouse : S:=hint_mouseoptions;
  178. hcDesktopOptions: S:=hint_desktopoptions;
  179. hcStartup : S:=hint_startup;
  180. hcColors : S:=hint_colors;
  181. hcOpenINI : S:=hint_openini;
  182. hcSaveINI : S:=hint_saveini;
  183. hcSaveAsINI : S:=hint_saveasini;
  184. hcWindowMenu : S:=hint_windowmenu;
  185. hcTile : S:=hint_tile;
  186. hcCascade : S:=hint_cascade;
  187. hcCloseAll : S:=hint_closeall;
  188. hcResize : S:=hint_resize;
  189. hcZoom : S:=hint_zoom;
  190. hcNext : S:=hint_next;
  191. hcPrev : S:=hint_prev;
  192. hcClose : S:=hint_closewindow;
  193. hcWindowList : S:=hint_windowlist;
  194. hcUserScreenWindow:S:=hint_userscreenwindow;
  195. hcHelpMenu : S:=hint_helpmenu;
  196. hcHelpContents : S:=hint_helpcontents;
  197. hcHelpIndex : S:=hint_helpindex;
  198. hcHelpTopicSearch:S:=hint_helptopicsearch;
  199. hcHelpPrevTopic : S:=hint_helpprevtopic;
  200. hcHelpUsingHelp : S:=hint_helphowtouse;
  201. hcHelpFiles : S:=hint_helpfiles;
  202. hcOpenAtCursor : S:=hint_openatcursor;
  203. hcBrowseAtCursor: S:=hint_browseatcursor;
  204. hcEditorOptions : S:=hint_editoroptionscur;
  205. else S:='???';
  206. end;
  207. Hint:=S;
  208. end;
  209. procedure TFPHTMLFileLinkScanner.ProcessDoc(Doc: PHTMLLinkScanFile);
  210. begin
  211. PushStatus(FormatStrStr(msg_indexingfile,Doc^.GetDocumentURL));
  212. inherited ProcessDoc(Doc);
  213. PopStatus;
  214. end;
  215. function TFPHTMLFileLinkScanner.CheckURL(const URL: string): boolean;
  216. var OK: boolean;
  217. const HTTPPrefix = 'http:';
  218. FTPPrefix = 'ftp:';
  219. begin
  220. OK:=inherited CheckURL(URL);
  221. if OK then OK:=DirAndNameOf(URL)<>'';
  222. if OK then OK:=CompareText(copy(ExtOf(URL),1,4),'.HTM')=0;
  223. if OK then OK:=CompareText(copy(URL,1,length(HTTPPrefix)),HTTPPrefix)<>0;
  224. if OK then OK:=CompareText(copy(URL,1,length(FTPPrefix)),FTPPrefix)<>0;
  225. CheckURL:=OK;
  226. end;
  227. function TFPHTMLFileLinkScanner.CheckText(const Text: string): boolean;
  228. var OK: boolean;
  229. S: string;
  230. begin
  231. S:=Trim(Text);
  232. OK:=(S<>'') and (copy(S,1,1)<>'[');
  233. CheckText:=OK;
  234. end;
  235. procedure InitHelpSystem;
  236. procedure AddHelpFile(HelpFile,Param: string);
  237. begin
  238. {$IFDEF DEBUG}SetStatus(msg_LoadingHelpFile+' ('+SmartPath(HelpFile)+')');{$ENDIF}
  239. if HelpFacility^.AddFile(HelpFile,Param)=nil then
  240. ErrorBox(FormatStrStr(msg_failedtoloadhelpfile,HelpFile),nil);
  241. {$IFDEF DEBUG}SetStatus(msg_LoadingHelpFile);{$ENDIF}
  242. end;
  243. var I,P: sw_integer;
  244. S: string;
  245. Param: string;
  246. begin
  247. New(HelpFacility, Init);
  248. WOAHelp.RegisterHelpType;
  249. WNGHelp.RegisterHelpType;
  250. WOS2Help.RegisterHelpType;
  251. WWinHelp.RegisterHelpType;
  252. WVPHelp.RegisterHelpType;
  253. WHTMLHlp.RegisterHelpType;
  254. PushStatus(msg_LoadingHelpFiles);
  255. for I:=0 to HelpFiles^.Count-1 do
  256. begin
  257. S:=HelpFiles^.At(I)^; Param:='';
  258. P:=Pos('|',S);
  259. if P>0 then
  260. begin Param:=copy(S,P+1,High(S)); S:=copy(S,1,P-1); end;
  261. AddHelpFile(S,Param);
  262. end;
  263. PopStatus;
  264. end;
  265. procedure CheckHelpSystem;
  266. begin
  267. if HelpInited then Exit;
  268. InitHelpSystem;
  269. HelpInited:=true;
  270. end;
  271. procedure DoneHelpSystem;
  272. begin
  273. if assigned(HelpFacility) then
  274. begin
  275. Dispose(HelpFacility, Done);
  276. HelpFacility:=nil;
  277. end;
  278. HelpInited:=false;
  279. end;
  280. procedure HelpCreateWindow;
  281. var R: TRect;
  282. begin
  283. CheckHelpSystem;
  284. if HelpWindow=nil then
  285. begin
  286. Desktop^.GetExtent(R); R.Grow(-15,-3); Dec(R.A.Y);
  287. New(HelpWindow, Init(R, dialog_help, 0, 0, SearchFreeWindowNo));
  288. if HelpWindow<>nil then
  289. begin
  290. HelpWindow^.Hide;
  291. Desktop^.Insert(HelpWindow);
  292. end;
  293. end;
  294. end;
  295. procedure Help(FileID, Context: THelpCtx; Modal: boolean);
  296. begin
  297. if Modal then
  298. begin MessageBox(msg_modalhelpnotimplemented,nil,mfInformation+mfInsertInApp+mfOKButton); Exit; end;
  299. HelpCreateWindow;
  300. with HelpWindow^ do
  301. begin
  302. HelpWindow^.ShowTopic(FileID,Context);
  303. if GetState(sfVisible)=false then Show;
  304. MakeFirst;
  305. end;
  306. Message(Application,evCommand,cmUpdate,nil);
  307. end;
  308. procedure HelpTopicSearch(Editor: PEditor);
  309. var S: string;
  310. begin
  311. if Editor=nil then S:='' else
  312. S:=GetEditorCurWord(Editor,[]);
  313. HelpTopic(S);
  314. end;
  315. procedure HelpTopic(const S: string);
  316. var FileID: word;
  317. Ctx : THelpCtx;
  318. var Found: boolean;
  319. begin
  320. CheckHelpSystem;
  321. PushStatus(msg_LocatingTopic);
  322. Found:=HelpFacility^.TopicSearch(S,FileID,Ctx);
  323. PopStatus;
  324. if Found then
  325. Help(FileID,Ctx,false)
  326. else
  327. HelpIndex(S);
  328. end;
  329. procedure HelpIndex(Keyword: string);
  330. begin
  331. HelpCreateWindow;
  332. with HelpWindow^ do
  333. begin
  334. PushStatus(msg_BuildingHelpIndex);
  335. HelpWindow^.ShowIndex;
  336. if Keyword<>'' then
  337. HelpWindow^.HelpView^.Lookup(Keyword);
  338. PopStatus;
  339. if GetState(sfVisible)=false then Show;
  340. MakeFirst;
  341. end;
  342. Message(Application,evCommand,cmUpdate,nil);
  343. end;
  344. procedure PushStatus(S: string);
  345. begin
  346. if StatusLine=nil then
  347. Exit;
  348. If StatusStackPtr<=MaxStatusLevel then
  349. StatusStack[StatusStackPtr]:=PAdvancedStatusLine(StatusLine)^.GetStatusText
  350. else
  351. StatusStack[MaxStatusLevel]:=PAdvancedStatusLine(StatusLine)^.GetStatusText;
  352. SetStatus(S);
  353. Inc(StatusStackPtr);
  354. end;
  355. procedure PopStatus;
  356. begin
  357. if StatusLine=nil then
  358. Exit;
  359. Dec(StatusStackPtr);
  360. If StatusStackPtr<=MaxStatusLevel then
  361. SetStatus(StatusStack[StatusStackPtr])
  362. else
  363. SetStatus(StatusStack[MaxStatusLevel]);
  364. end;
  365. procedure SetStatus(S: string);
  366. begin
  367. if StatusLine=nil then
  368. Exit;
  369. PAdvancedStatusLine(StatusLine)^.SetStatusText(S);
  370. end;
  371. procedure ClearStatus;
  372. begin
  373. PAdvancedStatusLine(StatusLine)^.ClearStatusText;
  374. end;
  375. function FPHTMLGetSectionColor(Section: THTMLSection; var Color: byte): boolean;
  376. var OK: boolean;
  377. S: string;
  378. begin
  379. Color:=0;
  380. OK:=(ord(Section) in [1..length(CHTMLSectionAttrs)]);
  381. if OK then
  382. begin
  383. S:=#0;
  384. S:=copy(CHTMLSectionAttrs,ord(Section),1);
  385. if Assigned(Application)=false then Color:=0 else
  386. Color:=Application^.GetColor(ord(S[1]));
  387. if (Color and $0f) = ((Color and $f0) shr 4) then { same color ? }
  388. OK:=false;
  389. end;
  390. FPHTMLGetSectionColor:=OK;
  391. end;
  392. function FPNGGetAttrColor(Attr: char; var Color: byte): boolean;
  393. var OK: boolean;
  394. begin
  395. OK:=false;
  396. case Attr of
  397. 'A' : OK:=FPHTMLGetSectionColor(hsHeading1,Color);
  398. 'B' : OK:=FPHTMLGetSectionColor(hsHeading2,Color);
  399. 'b' : OK:=FPHTMLGetSectionColor(hsHeading5,Color);
  400. 'U' : OK:=FPHTMLGetSectionColor(hsHeading3,Color);
  401. 'N' : OK:=FPHTMLGetSectionColor(hsHeading4,Color);
  402. {$ifdef DEBUGMSG}
  403. else ErrorBox('Unknown attr encountered : "'+Attr+'"',nil);
  404. {$endif}
  405. end;
  406. FPNGGetAttrColor:=OK;
  407. end;
  408. function FPINFGetAttrColor(TextStyle, TextColor: byte; var Color: byte): boolean;
  409. var OK: boolean;
  410. begin
  411. OK:=false;
  412. case TextColor of
  413. 1 : OK:=FPHTMLGetSectionColor(hsHeading1,Color);
  414. 2 : OK:=FPHTMLGetSectionColor(hsHeading2,Color);
  415. 3 : OK:=FPHTMLGetSectionColor(hsHeading3,Color);
  416. end;
  417. FPINFGetAttrColor:=OK;
  418. end;
  419. procedure InitHelpFiles;
  420. begin
  421. HTMLGetSectionColor:={$ifdef FPC}@{$endif}FPHTMLGetSectionColor;
  422. NGGetAttrColor:={$ifdef FPC}@{$endif}FPNGGetAttrColor;
  423. INFGetAttrColor:={$ifdef FPC}@{$endif}FPINFGetAttrColor;
  424. New(HelpFiles, Init(10,10));
  425. end;
  426. procedure DoneHelpFiles;
  427. begin
  428. if assigned(HelpFiles) then
  429. Dispose(HelpFiles, Done);
  430. end;
  431. procedure CloseHelpWindows;
  432. procedure CloseIfHelpWindow(P: PView); {$ifndef FPC}far;{$endif}
  433. begin
  434. if P^.HelpCtx=hcHelpWindow then
  435. begin
  436. Message(P,evCommand,cmClose,nil);
  437. {Dispose(P, Done); help windows are only hidden on close so we've
  438. to destroy them manually
  439. but this was wrong as it was not correctly
  440. resetting the corresponding pointer in whelp unit PM }
  441. end;
  442. end;
  443. begin
  444. Desktop^.ForEach(@CloseIfHelpWindow);
  445. end;
  446. END.
  447. {
  448. $Log$
  449. Revision 1.6 2002-09-07 15:40:43 peter
  450. * old logs removed and tabs fixed
  451. Revision 1.5 2002/01/24 09:21:41 pierre
  452. * only disable Alt-X in Options|Compiler dialog
  453. }