2ちゃんねるブラウザ「OpenJane」改造総合スレ 4

このエントリーをはてなブックマークに追加
145438@改造スレ2
Doe専用なんですけど、スレの画面で

「1」キーを押すとレス1に画面がジャンプ。
すぐに「2」を押すとレス12にジャンプ。
さらにすぐ「3」を押すとレス123にジャンプ。
キータイプの間隔が0.3秒以内なら連続で入力と看做します。

emacsのインクリメンタルサーチみたいにジャンプしたいな、と
思って付けた機能です。

名づけてインクリメンタルジャンプ。

ちょっと長くなりますがソース挙げてみます。
一部、スマートじゃ無いところもありますんで添削求むw
146438@改造スレ2:03/02/10 22:53 ID:jMLIksdt
Main.pas
700行目あたり------------------------------
  private
   UILock: Boolean;
+  {RTH インクリメンタルジャンプ}
+  {$IFNDEF IE}
+   resJumpTimer: TTimer;
+   afterLine: Integer;
+  {$ENDIF}
+  {/RTH インクリメンタルジャンプ}
   requestingBoard: TBoard;
   procGetCategoryList: TAsyncReq;
-------------------------------------------
850行目あたり------------------------------
   function ProtocolCheck(const S: string):Boolean;
   function CutImenu(const S: string):string;
+  {RTH インクリメンタルジャンプ}
+   {$IFNDEF IE}
+   procedure ResJumpTimerTimer(Sender: TObject);
+   {$ENDIF}
+  {/RTH インクリメンタルジャンプ}
  public
   { Public 宣言 }
   //ListFontColor: TColor; //※[457]
-------------------------------------------
147438@改造スレ2:03/02/10 22:54 ID:jMLIksdt
1700行目あたり------------------------------
   fav.name := 'リンク';
   favorites.Insert(0, fav);
  end;

+ {RTH インクリメンタルジャンプ}
+ {$IFNDEF IE}
+  procedure InitResJumpTimer;
+  begin
+   resJumpTimer := TTimer.Create(self);
+   resJumpTimer.Interval := 300; // キータイプ間隔は0.3秒
+   resJumpTimer.Enabled := False;
+   resJumpTimer.OnTimer := ResJumpTimerTimer;
+  end;
+ {$ENDIF}
+ {/RTH インクリメンタルジャンプ}

 var
  boardLoaded: boolean;
  TimeZoneInfo: _TIME_ZONE_INFORMATION;
-------------------------------------------
148438@改造スレ2:03/02/10 22:55 ID:jMLIksdt
1800行目あたり------------------------------
  (* Window位置復元はOnShowでやる *)
  //LoadWindowPos;
  KeyConf; (* 9 Feb. 2002 by 816=817 *)

  SetMouseGesture;
+  {RTH インクリメンタルジャンプ}
+  {$IFNDEF IE}
+  InitResJumpTimer;
+  {$ENDIF}
+  {/RTH インクリメンタルジャンプ}

  {$IFDEF BENCH}
  InitBench;
  {$ENDIF}

  (* スレ一覧 *)
  subjectReadyEvent := THogeEvent.Create;
-------------------------------------------
2000行目あたり------------------------------
  D2HTML.Free;
  NEWD2HTML.Free;
  POPUPD2HTML.Free;
+  {RTH インクリメンタルジャンプ}
+  {$IFNDEF IE}
+  resJumpTimer.Free;
+  {$ENDIF}
+  {/RTH インクリメンタルジャンプ}

  NGWords.Free;
  NGNames.Free;
-------------------------------------------
149438@改造スレ2:03/02/10 22:55 ID:jMLIksdt
4000行目あたり------------------------------
 procedure TMainWnd.UpdateCurrentView(index: integer);
 var
  i: integer;
 begin
+  {RTH インクリメンタルジャンプ}
+  {$IFNDEF IE}
+  self.resJumpTimer.Enabled := False;
+  {$ENDIF}
+  {/RTH インクリメンタルジャンプ}

  if (0 <= index) and (index < viewList.Count) then
  begin
-------------------------------------------
8000行目あたり------------------------------
 procedure TMainWnd.OnBrowserKeyDown(Sender: TObject; var Key: Word;
                   Shift: TShiftState);
 var
  view: THogeTextView;
  item: THogeTVItem;
  point: TPoint;
  index: integer;
  ref: string;
  Cancel: WordBool;
+  viewItem: TViewItem; //RTH インクリメンタルジャンプ
 begin
  view := THogeTextView(Sender);
-------------------------------------------
150438@改造スレ2:03/02/10 22:58 ID:jMLIksdt
8100行目あたり------------------------------
     BrowserStatusTextChange(Sender, ref);
    end;
    Key := 0;
   end;
+  {RTH インクリメンタルジャンプ}
+  Ord('0')..Ord('9'),
+  VK_NUMPAD0,VK_NUMPAD1,VK_NUMPAD2,VK_NUMPAD3,VK_NUMPAD4,
+  VK_NUMPAD5,VK_NUMPAD6,VK_NUMPAD7,VK_NUMPAD8,VK_NUMPAD9:
+   begin
+    viewItem := GetActiveView;
+    if viewItem = nil then
+     exit;
+    if viewItem.thread = nil then
+     exit;
+    begin
+     self.resJumpTimer.Enabled := False;
+     case Key of
+     Ord('0')..Ord('9'):
+      afterLine := afterLine * 10 + Ord(key)-Ord('0');
+     VK_NUMPAD0:
+      afterLine := afterLine * 10 + 0;
+     VK_NUMPAD1:
+      afterLine := afterLine * 10 + 1;
+     VK_NUMPAD2:
+      afterLine := afterLine * 10 + 2;
+     VK_NUMPAD3:
+      afterLine := afterLine * 10 + 3;
+     VK_NUMPAD4:
+      afterLine := afterLine * 10 + 4;

つづく…
151438@改造スレ2:03/02/10 23:00 ID:jMLIksdt
続き

+     VK_NUMPAD5:
+      afterLine := afterLine * 10 + 5;
+     VK_NUMPAD6:
+      afterLine := afterLine * 10 + 6;
+     VK_NUMPAD7:
+      afterLine := afterLine * 10 + 7;
+     VK_NUMPAD8:
+      afterLine := afterLine * 10 + 8;
+     VK_NUMPAD9:
+      afterLine := afterLine * 10 + 9;
+     end;
+     if afterLine >= 1 then
+      viewItem.ScrollToAnchor(afterLine -1, true);
+     self.resJumpTimer.Enabled := True;
+    end;
+   end;
+  {/RTH インクリメンタルジャンプ}
  end;
 end;
 {$ENDIF}
-------------------------------------------
152438@改造スレ2:03/02/10 23:01 ID:jMLIksdt
最後あたり----------------------------------
  if ProtocolCheck(s) then
   DoOnFileDownlaod(s);
 end;
 {$ENDIF}

+ {RTH インクリメンタルジャンプ}
+ {$IFNDEF IE}
+ procedure TMainWnd.ResJumpTimerTimer(Sender: TObject);
+ begin
+  Self.resJumpTimer.Enabled := false;
+  afterLine := 0;
+ end;
+ {$ENDIF}
+ {/RTH インクリメンタルジャンプ}

 //------------------------------------------------------------------------------
-------------------------------------------

以上。連続カキコスマソ(´・ω・`)