Rev 22 | Rev 24 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 22 | Rev 23 | ||
---|---|---|---|
Line 12... | Line 12... | ||
12 | // TODO: localize |
12 | // TODO: localize |
13 | // TODO: wieso geht copy paste im twebbrowser nicht??? |
13 | // TODO: wieso geht copy paste im twebbrowser nicht??? |
14 | // Wieso dauert webbrowser1 erste kompilierung so lange??? |
14 | // Wieso dauert webbrowser1 erste kompilierung so lange??? |
15 | // TODO: wieso kommt syntax fehler zweimal? einmal stderr einmal stdout? |
15 | // TODO: wieso kommt syntax fehler zweimal? einmal stderr einmal stdout? |
16 | // TODO: Browser titlebar (link preview) |
16 | // TODO: Browser titlebar (link preview) |
17 | // TODO: search prev |
- | |
18 | // TODO: wenn man schrift größer/kleiner macht, soll die bildschirmseite zentriert bleiben |
- | |
19 | // TODO: todo liste |
17 | // TODO: todo liste |
20 | 18 | ||
21 | // Future ideas |
19 | // Future ideas |
22 | // - code explorer / code insight |
20 | // - code explorer / code insight |
23 | // - verschiedene php versionen? |
21 | // - verschiedene php versionen? |
Line 33... | Line 31... | ||
33 | Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, |
31 | Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, |
34 | Dialogs, StdCtrls, OleCtrls, ComCtrls, ExtCtrls, ToolWin, IniFiles, |
32 | Dialogs, StdCtrls, OleCtrls, ComCtrls, ExtCtrls, ToolWin, IniFiles, |
35 | SynEditHighlighter, SynHighlighterPHP, SynEdit, SHDocVw_TLB, FindReplace, |
33 | SynEditHighlighter, SynHighlighterPHP, SynEdit, SHDocVw_TLB, FindReplace, |
36 | System.Actions, Vcl.ActnList, System.UITypes; |
34 | System.Actions, Vcl.ActnList, System.UITypes; |
37 | 35 | ||
- | 36 | {.$DEFINE OnlineHelp} |
|
- | 37 | ||
38 | type |
38 | type |
39 | TForm1 = class(TForm) |
39 | TForm1 = class(TForm) |
40 | PageControl1: TPageControl; |
40 | PageControl1: TPageControl; |
41 | PlaintextTabSheet: TTabSheet; |
41 | PlaintextTabSheet: TTabSheet; |
42 | HtmlTabSheet: TTabSheet; |
42 | HtmlTabSheet: TTabSheet; |
Line 72... | Line 72... | ||
72 | Button7: TButton; |
72 | Button7: TButton; |
73 | ActionOpen: TAction; |
73 | ActionOpen: TAction; |
74 | Button8: TButton; |
74 | Button8: TButton; |
75 | Button9: TButton; |
75 | Button9: TButton; |
76 | ActionFindPrev: TAction; |
76 | ActionFindPrev: TAction; |
- | 77 | Timer1: TTimer; |
|
- | 78 | ActionSpaceToTab: TAction; |
|
- | 79 | Button11: TButton; |
|
77 | procedure Run(Sender: TObject); |
80 | procedure Run(Sender: TObject); |
78 | procedure FormShow(Sender: TObject); |
81 | procedure FormShow(Sender: TObject); |
79 | procedure FormCreate(Sender: TObject); |
82 | procedure FormCreate(Sender: TObject); |
80 | procedure FormDestroy(Sender: TObject); |
83 | procedure FormDestroy(Sender: TObject); |
81 | procedure FormClose(Sender: TObject; var Action: TCloseAction); |
84 | procedure FormClose(Sender: TObject; var Action: TCloseAction); |
Line 99... | Line 102... | ||
99 | MousePos: TPoint; var Handled: Boolean); |
102 | MousePos: TPoint; var Handled: Boolean); |
100 | procedure ActionOpenExecute(Sender: TObject); |
103 | procedure ActionOpenExecute(Sender: TObject); |
101 | procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); |
104 | procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); |
102 | procedure Memo2KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); |
105 | procedure Memo2KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); |
103 | procedure ActionFindPrevExecute(Sender: TObject); |
106 | procedure ActionFindPrevExecute(Sender: TObject); |
- | 107 | procedure SynEdit1MouseCursor(Sender: TObject; |
|
- | 108 | const aLineCharPos: TBufferCoord; var aCursor: TCursor); |
|
- | 109 | procedure Timer1Timer(Sender: TObject); |
|
- | 110 | procedure ActionSpaceToTabExecute(Sender: TObject); |
|
104 | private |
111 | private |
105 | CurSearchTerm: string; |
112 | CurSearchTerm: string; |
106 | HlpPrevPageIndex: integer; |
113 | HlpPrevPageIndex: integer; |
107 | SrcRep: TFindReplace; |
114 | SrcRep: TFindReplace; |
- | 115 | {$IFDEF OnlineHelp} |
|
- | 116 | gOnlineHelpWord: string; |
|
- | 117 | {$ENDIF} |
|
108 | procedure Help; |
118 | procedure Help; |
109 | function MarkUpLineReference(cont: string): string; |
119 | function MarkUpLineReference(cont: string): string; |
110 | protected |
120 | protected |
111 | ChmIndex: TMemIniFile; |
121 | ChmIndex: TMemIniFile; |
112 | FScrapFile: string; |
122 | FScrapFile: string; |
Line 120... | Line 130... | ||
120 | implementation |
130 | implementation |
121 | 131 | ||
122 | {$R *.dfm} |
132 | {$R *.dfm} |
123 | 133 | ||
124 | uses |
134 | uses |
125 | Functions, StrUtils, WebBrowserUtils, FastPHPUtils, Math, ShellAPI; |
135 | Functions, StrUtils, WebBrowserUtils, FastPHPUtils, Math, ShellAPI, RichEdit; |
126 | 136 | ||
127 | // TODO: FindPrev ? |
137 | // TODO: FindPrev ? |
128 | procedure TForm1.ActionFindNextExecute(Sender: TObject); |
138 | procedure TForm1.ActionFindNextExecute(Sender: TObject); |
129 | begin |
139 | begin |
130 | SrcRep.FindNext; |
140 | SrcRep.FindNext; |
Line 184... | Line 194... | ||
184 | begin |
194 | begin |
185 | SynEdit1.Lines.SaveToFile(GetScrapFile); |
195 | SynEdit1.Lines.SaveToFile(GetScrapFile); |
186 | SynEdit1.Modified := false; |
196 | SynEdit1.Modified := false; |
187 | end; |
197 | end; |
188 | 198 | ||
- | 199 | procedure TForm1.ActionSpaceToTabExecute(Sender: TObject); |
|
- | 200 | ||
- | 201 | function SpacesAtBeginning(line: string): integer; |
|
- | 202 | begin |
|
- | 203 | if line.Trim = '' then exit(0); |
|
- | 204 | result := 0; |
|
- | 205 | while line[result+1] = ' ' do |
|
- | 206 | begin |
|
- | 207 | inc(result); |
|
- | 208 | end; |
|
- | 209 | end; |
|
- | 210 | ||
- | 211 | function GuessIndent(lines: TStrings): integer; |
|
- | 212 | function _Check(indent: integer): boolean; |
|
- | 213 | var |
|
- | 214 | i: integer; |
|
- | 215 | begin |
|
- | 216 | result := true; |
|
- | 217 | for i := 0 to lines.Count-1 do |
|
- | 218 | if SpacesAtBeginning(lines.Strings[i]) mod indent <> 0 then |
|
- | 219 | begin |
|
- | 220 | // ShowMessageFmt('Zeile "%s" nicht durch %d teilbar!', [lines.strings[i], indent]); |
|
- | 221 | exit(false); |
|
- | 222 | end; |
|
- | 223 | end; |
|
- | 224 | var |
|
- | 225 | i: integer; |
|
- | 226 | begin |
|
- | 227 | for i := 8 downto 2 do |
|
- | 228 | begin |
|
- | 229 | if _Check(i) then exit(i); |
|
- | 230 | end; |
|
- | 231 | result := -1; |
|
- | 232 | end; |
|
- | 233 | ||
- | 234 | procedure SpaceToTab(lines: TStrings; indent: integer); |
|
- | 235 | var |
|
- | 236 | i, spaces: integer; |
|
- | 237 | begin |
|
- | 238 | for i := 0 to lines.Count-1 do |
|
- | 239 | begin |
|
- | 240 | spaces := SpacesAtBeginning(lines.Strings[i]); |
|
- | 241 | lines.Strings[i] := StringOfChar(#9, spaces div indent) + StringOfChar(' ', spaces mod indent) + Copy(lines.Strings[i], spaces+1, Length(lines.Strings[i])-spaces); |
|
- | 242 | end; |
|
- | 243 | end; |
|
- | 244 | ||
- | 245 | function SpacesAvailable(lines: TStrings): boolean; |
|
- | 246 | var |
|
- | 247 | i, spaces: integer; |
|
- | 248 | begin |
|
- | 249 | for i := 0 to lines.Count-1 do |
|
- | 250 | begin |
|
- | 251 | spaces := SpacesAtBeginning(lines.Strings[i]); |
|
- | 252 | if spaces > 0 then exit(true); |
|
- | 253 | end; |
|
- | 254 | exit(false); |
|
- | 255 | end; |
|
- | 256 | ||
- | 257 | var |
|
- | 258 | val: string; |
|
- | 259 | ind: integer; |
|
- | 260 | resourcestring |
|
- | 261 | SNoLinesAvailable = 'No lines with spaces at the beginning available'; |
|
- | 262 | begin |
|
- | 263 | // TODO: if something is selected, only process the selected part |
|
- | 264 | ||
- | 265 | if not SpacesAvailable(SynEdit1.Lines) then |
|
- | 266 | begin |
|
- | 267 | ShowMessage(SNoLinesAvailable); |
|
- | 268 | exit; |
|
- | 269 | end; |
|
- | 270 | ||
- | 271 | ind := GuessIndent(SynEdit1.Lines); |
|
- | 272 | if ind <> -1 then val := IntToStr(ind); |
|
- | 273 | ||
- | 274 | InputQuery('Spaces to tabs', 'Indent:', val); // TODO: handle CANCEL correctly... |
|
- | 275 | if TryStrToInt(val.Trim, ind) then |
|
- | 276 | begin |
|
- | 277 | if ind = 0 then exit; |
|
- | 278 | SpaceToTab(SynEdit1.Lines, ind); |
|
- | 279 | end; |
|
- | 280 | ||
- | 281 | if SynEdit1.CanFocus then SynEdit1.SetFocus; |
|
- | 282 | end; |
|
- | 283 | ||
189 | procedure TForm1.ActionESCExecute(Sender: TObject); |
284 | procedure TForm1.ActionESCExecute(Sender: TObject); |
190 | begin |
285 | begin |
191 | if (HlpPrevPageIndex <> -1) and (PageControl2.ActivePage = HelpTabSheet) and |
286 | if (HlpPrevPageIndex <> -1) and (PageControl2.ActivePage = HelpTabSheet) and |
192 | (HelpTabsheet.TabVisible) then |
287 | (HelpTabsheet.TabVisible) then |
193 | begin |
288 | begin |
Line 243... | Line 338... | ||
243 | finally |
338 | finally |
244 | Screen.Cursor := crDefault; |
339 | Screen.Cursor := crDefault; |
245 | end; |
340 | end; |
246 | end; |
341 | end; |
247 | 342 | ||
- | 343 | procedure TForm1.SynEdit1MouseCursor(Sender: TObject; const aLineCharPos: TBufferCoord; var aCursor: TCursor); |
|
- | 344 | {$IFDEF OnlineHelp} |
|
- | 345 | var |
|
- | 346 | Line: Integer; |
|
- | 347 | Column: Integer; |
|
- | 348 | word: string; |
|
- | 349 | begin |
|
- | 350 | Line := aLineCharPos.Line-1; |
|
- | 351 | Column := aLineCharPos.Char-1; |
|
- | 352 | word := GetWordUnderPos(TSynEdit(Sender), Line, Column); |
|
- | 353 | if word <> gOnlineHelpWord then |
|
- | 354 | begin |
|
- | 355 | gOnlineHelpWord := word; |
|
- | 356 | Timer1.Enabled := false; |
|
- | 357 | Timer1.Enabled := true; |
|
- | 358 | end; |
|
- | 359 | {$ELSE} |
|
- | 360 | begin |
|
- | 361 | {$ENDIF} |
|
- | 362 | end; |
|
- | 363 | ||
248 | procedure TForm1.SynEdit1MouseWheelDown(Sender: TObject; Shift: TShiftState; |
364 | procedure TForm1.SynEdit1MouseWheelDown(Sender: TObject; Shift: TShiftState; |
249 | MousePos: TPoint; var Handled: Boolean); |
365 | MousePos: TPoint; var Handled: Boolean); |
250 | begin |
366 | begin |
251 | if ssCtrl in Shift then |
367 | if ssCtrl in Shift then |
252 | begin |
368 | begin |
253 | SynEdit1.Font.Size := Max(SynEdit1.Font.Size - 1, 5); |
369 | SynEdit1.Font.Size := Max(SynEdit1.Font.Size - 1, 5); |
- | 370 | Handled := true; |
|
254 | end; |
371 | end |
- | 372 | else Handled := false; |
|
255 | end; |
373 | end; |
256 | 374 | ||
257 | procedure TForm1.SynEdit1MouseWheelUp(Sender: TObject; Shift: TShiftState; |
375 | procedure TForm1.SynEdit1MouseWheelUp(Sender: TObject; Shift: TShiftState; |
258 | MousePos: TPoint; var Handled: Boolean); |
376 | MousePos: TPoint; var Handled: Boolean); |
259 | begin |
377 | begin |
260 | if ssCtrl in Shift then |
378 | if ssCtrl in Shift then |
261 | begin |
379 | begin |
262 | SynEdit1.Font.Size := SynEdit1.Font.Size + 1; |
380 | SynEdit1.Font.Size := SynEdit1.Font.Size + 1; |
- | 381 | Handled := true; |
|
263 | end; |
382 | end |
- | 383 | else Handled := false; |
|
264 | end; |
384 | end; |
265 | 385 | ||
266 | procedure TForm1.SynEditFocusTimerTimer(Sender: TObject); |
386 | procedure TForm1.SynEditFocusTimerTimer(Sender: TObject); |
267 | begin |
387 | begin |
268 | SynEditFocusTimer.Enabled := false; |
388 | SynEditFocusTimer.Enabled := false; |
269 | Button1.SetFocus; // Workaround for weird bug... This (and the timer) is necessary to get the focus to SynEdit1 |
389 | Button1.SetFocus; // Workaround for weird bug... This (and the timer) is necessary to get the focus to SynEdit1 |
270 | SynEdit1.SetFocus; |
390 | SynEdit1.SetFocus; |
271 | end; |
391 | end; |
272 | 392 | ||
- | 393 | procedure TForm1.Timer1Timer(Sender: TObject); |
|
- | 394 | begin |
|
- | 395 | {$IFDEF OnlineHelp} |
|
- | 396 | Timer1.Enabled := false; |
|
- | 397 | ||
- | 398 | // TODO: Insert a small online help hint |
|
- | 399 | //Caption := gOnlineHelpWord; |
|
- | 400 | {$ENDIF} |
|
- | 401 | end; |
|
- | 402 | ||
273 | procedure TForm1.WebBrowser1BeforeNavigate2(ASender: TObject; |
403 | procedure TForm1.WebBrowser1BeforeNavigate2(ASender: TObject; |
274 | const pDisp: IDispatch; const URL, Flags, TargetFrameName, PostData, |
404 | const pDisp: IDispatch; const URL, Flags, TargetFrameName, PostData, |
275 | Headers: OleVariant; var Cancel: WordBool); |
405 | Headers: OleVariant; var Cancel: WordBool); |
276 | var |
406 | var |
277 | s, myURL: string; |
407 | s, myURL: string; |