fphelp.pas 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520
  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. hcRemoteDialog : S:=hint_remotedialog;
  173. hcTransferRemote: S:=hint_transferremote;
  174. hcEnvironmentMenu:S:=hint_environmentmenu;
  175. hcPreferences : S:=hint_preferences;
  176. hcEditor : S:=hint_editoroptions;
  177. hcCodeCompleteOptions:S:=hint_codecomplete;
  178. hcCodeTemplateOptions:S:=hint_codetemplates;
  179. hcMouse : S:=hint_mouseoptions;
  180. hcDesktopOptions: S:=hint_desktopoptions;
  181. hcStartup : S:=hint_startup;
  182. hcColors : S:=hint_colors;
  183. hcOpenINI : S:=hint_openini;
  184. hcSaveINI : S:=hint_saveini;
  185. hcSaveAsINI : S:=hint_saveasini;
  186. hcWindowMenu : S:=hint_windowmenu;
  187. hcTile : S:=hint_tile;
  188. hcCascade : S:=hint_cascade;
  189. hcCloseAll : S:=hint_closeall;
  190. hcResize : S:=hint_resize;
  191. hcZoom : S:=hint_zoom;
  192. hcNext : S:=hint_next;
  193. hcPrev : S:=hint_prev;
  194. hcClose : S:=hint_closewindow;
  195. hcWindowList : S:=hint_windowlist;
  196. hcUserScreenWindow:S:=hint_userscreenwindow;
  197. hcHelpMenu : S:=hint_helpmenu;
  198. hcHelpContents : S:=hint_helpcontents;
  199. hcHelpIndex : S:=hint_helpindex;
  200. hcHelpTopicSearch:S:=hint_helptopicsearch;
  201. hcHelpPrevTopic : S:=hint_helpprevtopic;
  202. hcHelpUsingHelp : S:=hint_helphowtouse;
  203. hcHelpFiles : S:=hint_helpfiles;
  204. hcOpenAtCursor : S:=hint_openatcursor;
  205. hcBrowseAtCursor: S:=hint_browseatcursor;
  206. hcEditorOptions : S:=hint_editoroptionscur;
  207. else S:='???';
  208. end;
  209. Hint:=S;
  210. end;
  211. procedure TFPHTMLFileLinkScanner.ProcessDoc(Doc: PHTMLLinkScanFile);
  212. begin
  213. PushStatus(FormatStrStr(msg_indexingfile,Doc^.GetDocumentURL));
  214. inherited ProcessDoc(Doc);
  215. PopStatus;
  216. end;
  217. function TFPHTMLFileLinkScanner.CheckURL(const URL: string): boolean;
  218. var OK: boolean;
  219. const HTTPPrefix = 'http:';
  220. FTPPrefix = 'ftp:';
  221. begin
  222. OK:=inherited CheckURL(URL);
  223. if OK then OK:=DirAndNameOf(URL)<>'';
  224. if OK then OK:=CompareText(copy(ExtOf(URL),1,4),'.HTM')=0;
  225. if OK then OK:=CompareText(copy(URL,1,length(HTTPPrefix)),HTTPPrefix)<>0;
  226. if OK then OK:=CompareText(copy(URL,1,length(FTPPrefix)),FTPPrefix)<>0;
  227. CheckURL:=OK;
  228. end;
  229. function TFPHTMLFileLinkScanner.CheckText(const Text: string): boolean;
  230. var OK: boolean;
  231. S: string;
  232. begin
  233. S:=Trim(Text);
  234. OK:=(S<>'') and (copy(S,1,1)<>'[');
  235. CheckText:=OK;
  236. end;
  237. procedure InitHelpSystem;
  238. procedure AddHelpFile(HelpFile,Param: string);
  239. begin
  240. {$IFDEF DEBUG}SetStatus(msg_LoadingHelpFile+' ('+SmartPath(HelpFile)+')');{$ENDIF}
  241. if HelpFacility^.AddFile(HelpFile,Param)=nil then
  242. ErrorBox(FormatStrStr(msg_failedtoloadhelpfile,HelpFile),nil);
  243. {$IFDEF DEBUG}SetStatus(msg_LoadingHelpFile);{$ENDIF}
  244. end;
  245. var I,P: sw_integer;
  246. S: string;
  247. Param: string;
  248. begin
  249. New(HelpFacility, Init);
  250. WOAHelp.RegisterHelpType;
  251. WNGHelp.RegisterHelpType;
  252. WOS2Help.RegisterHelpType;
  253. WWinHelp.RegisterHelpType;
  254. WVPHelp.RegisterHelpType;
  255. WHTMLHlp.RegisterHelpType;
  256. PushStatus(msg_LoadingHelpFiles);
  257. for I:=0 to HelpFiles^.Count-1 do
  258. begin
  259. S:=HelpFiles^.At(I)^; Param:='';
  260. P:=Pos('|',S);
  261. if P>0 then
  262. begin Param:=copy(S,P+1,High(S)); S:=copy(S,1,P-1); end;
  263. AddHelpFile(S,Param);
  264. end;
  265. PopStatus;
  266. end;
  267. procedure CheckHelpSystem;
  268. begin
  269. if HelpInited then Exit;
  270. InitHelpSystem;
  271. HelpInited:=true;
  272. end;
  273. procedure DoneHelpSystem;
  274. begin
  275. if assigned(HelpFacility) then
  276. begin
  277. Dispose(HelpFacility, Done);
  278. HelpFacility:=nil;
  279. end;
  280. HelpInited:=false;
  281. end;
  282. procedure HelpCreateWindow;
  283. var R: TRect;
  284. begin
  285. CheckHelpSystem;
  286. if HelpWindow=nil then
  287. begin
  288. Desktop^.GetExtent(R); R.Grow(-15,-3); Dec(R.A.Y);
  289. New(HelpWindow, Init(R, dialog_help, 0, 0, SearchFreeWindowNo));
  290. if HelpWindow<>nil then
  291. begin
  292. HelpWindow^.Hide;
  293. Desktop^.Insert(HelpWindow);
  294. end;
  295. end;
  296. end;
  297. procedure Help(FileID, Context: THelpCtx; Modal: boolean);
  298. begin
  299. if Modal then
  300. begin MessageBox(msg_modalhelpnotimplemented,nil,mfInformation+mfInsertInApp+mfOKButton); Exit; end;
  301. HelpCreateWindow;
  302. with HelpWindow^ do
  303. begin
  304. HelpWindow^.ShowTopic(FileID,Context);
  305. if GetState(sfVisible)=false then Show;
  306. MakeFirst;
  307. end;
  308. Message(Application,evCommand,cmUpdate,nil);
  309. end;
  310. procedure HelpTopicSearch(Editor: PEditor);
  311. var S: string;
  312. begin
  313. if Editor=nil then S:='' else
  314. S:=GetEditorCurWord(Editor,[]);
  315. HelpTopic(S);
  316. end;
  317. procedure HelpTopic(const S: string);
  318. var FileID: word;
  319. Ctx : THelpCtx;
  320. var Found: boolean;
  321. begin
  322. CheckHelpSystem;
  323. PushStatus(msg_LocatingTopic);
  324. Found:=HelpFacility^.TopicSearch(S,FileID,Ctx);
  325. PopStatus;
  326. if Found then
  327. Help(FileID,Ctx,false)
  328. else
  329. HelpIndex(S);
  330. end;
  331. procedure HelpIndex(Keyword: string);
  332. begin
  333. HelpCreateWindow;
  334. with HelpWindow^ do
  335. begin
  336. PushStatus(msg_BuildingHelpIndex);
  337. HelpWindow^.ShowIndex;
  338. if Keyword<>'' then
  339. HelpWindow^.HelpView^.Lookup(Keyword);
  340. PopStatus;
  341. if GetState(sfVisible)=false then Show;
  342. MakeFirst;
  343. end;
  344. Message(Application,evCommand,cmUpdate,nil);
  345. end;
  346. procedure PushStatus(S: string);
  347. begin
  348. if StatusLine=nil then
  349. Exit;
  350. If StatusStackPtr<=MaxStatusLevel then
  351. StatusStack[StatusStackPtr]:=PAdvancedStatusLine(StatusLine)^.GetStatusText
  352. else
  353. StatusStack[MaxStatusLevel]:=PAdvancedStatusLine(StatusLine)^.GetStatusText;
  354. SetStatus(S);
  355. Inc(StatusStackPtr);
  356. end;
  357. procedure PopStatus;
  358. begin
  359. if StatusLine=nil then
  360. Exit;
  361. Dec(StatusStackPtr);
  362. If StatusStackPtr<=MaxStatusLevel then
  363. SetStatus(StatusStack[StatusStackPtr])
  364. else
  365. SetStatus(StatusStack[MaxStatusLevel]);
  366. end;
  367. procedure SetStatus(S: string);
  368. begin
  369. if StatusLine=nil then
  370. Exit;
  371. PAdvancedStatusLine(StatusLine)^.SetStatusText(S);
  372. end;
  373. procedure ClearStatus;
  374. begin
  375. PAdvancedStatusLine(StatusLine)^.ClearStatusText;
  376. end;
  377. function FPHTMLGetSectionColor(Section: THTMLSection; var Color: byte): boolean;
  378. var OK: boolean;
  379. S: string;
  380. begin
  381. Color:=0;
  382. OK:=(ord(Section) in [1..length(CHTMLSectionAttrs)]);
  383. if OK then
  384. begin
  385. S:=#0;
  386. S:=copy(CHTMLSectionAttrs,ord(Section),1);
  387. if Assigned(Application)=false then Color:=0 else
  388. Color:=Application^.GetColor(ord(S[1]));
  389. if (Color and $0f) = ((Color and $f0) shr 4) then { same color ? }
  390. OK:=false;
  391. end;
  392. FPHTMLGetSectionColor:=OK;
  393. end;
  394. function FPNGGetAttrColor(Attr: char; var Color: byte): boolean;
  395. var OK: boolean;
  396. begin
  397. OK:=false;
  398. case Attr of
  399. 'A' : OK:=FPHTMLGetSectionColor(hsHeading1,Color);
  400. 'B' : OK:=FPHTMLGetSectionColor(hsHeading2,Color);
  401. 'b' : OK:=FPHTMLGetSectionColor(hsHeading5,Color);
  402. 'U' : OK:=FPHTMLGetSectionColor(hsHeading3,Color);
  403. 'N' : OK:=FPHTMLGetSectionColor(hsHeading4,Color);
  404. {$ifdef DEBUGMSG}
  405. else ErrorBox('Unknown attr encountered : "'+Attr+'"',nil);
  406. {$endif}
  407. end;
  408. FPNGGetAttrColor:=OK;
  409. end;
  410. function FPINFGetAttrColor(TextStyle, TextColor: byte; var Color: byte): boolean;
  411. var OK: boolean;
  412. begin
  413. OK:=false;
  414. case TextColor of
  415. 1 : OK:=FPHTMLGetSectionColor(hsHeading1,Color);
  416. 2 : OK:=FPHTMLGetSectionColor(hsHeading2,Color);
  417. 3 : OK:=FPHTMLGetSectionColor(hsHeading3,Color);
  418. end;
  419. FPINFGetAttrColor:=OK;
  420. end;
  421. procedure InitHelpFiles;
  422. begin
  423. HTMLGetSectionColor:={$ifdef FPC}@{$endif}FPHTMLGetSectionColor;
  424. NGGetAttrColor:={$ifdef FPC}@{$endif}FPNGGetAttrColor;
  425. INFGetAttrColor:={$ifdef FPC}@{$endif}FPINFGetAttrColor;
  426. New(HelpFiles, Init(10,10));
  427. end;
  428. procedure DoneHelpFiles;
  429. begin
  430. if assigned(HelpFiles) then
  431. Dispose(HelpFiles, Done);
  432. end;
  433. procedure CloseHelpWindows;
  434. procedure CloseIfHelpWindow(P: PView); {$ifndef FPC}far;{$endif}
  435. begin
  436. if P^.HelpCtx=hcHelpWindow then
  437. begin
  438. Message(P,evCommand,cmClose,nil);
  439. {Dispose(P, Done); help windows are only hidden on close so we've
  440. to destroy them manually
  441. but this was wrong as it was not correctly
  442. resetting the corresponding pointer in whelp unit PM }
  443. end;
  444. end;
  445. begin
  446. Desktop^.ForEach(@CloseIfHelpWindow);
  447. end;
  448. END.
  449. {
  450. $Log$
  451. Revision 1.7 2002-11-28 12:57:42 pierre
  452. * new hints for remote addition
  453. Revision 1.6 2002/09/07 15:40:43 peter
  454. * old logs removed and tabs fixed
  455. Revision 1.5 2002/01/24 09:21:41 pierre
  456. * only disable Alt-X in Options|Compiler dialog
  457. }