プラグイン プログラム構成 後編

 

イベント処理 mRowCol.pas の中に必要な処理を書きます。

ここで渡される「hwnd: HWND」は、開いている文書毎に変わるのが重要な項目です。

 

procedure SetRowCol(hwnd: HWND);
var
  sStr1: String;
  sStr2: String;
  sStr4: String;
  sStr6: WideString;
  sStr7: WideString;
  sStr9: String;
  iValue1: Integer;
  iValue2: Integer;
  iRow1: Integer;
  iLen2: Integer;
  iLen3: Integer;
  iLen5: Integer;
  iNum2: Integer;
  iMod2: Integer;
  iPosX: Integer;
  iPosY: Integer;
  LpPPoint1: PPoint;
  Text: array [0..MAX_LINE_LENGTH-1] of Char;
  LpBuffer: array [0..MAX_PATH - 1] of Char;
  OutPutText: array [0..MAX_LINE_LENGTH-1] of Char;
  LineInfo: TGetLineInfo;
begin
  //カーソル位置
  New(LpPPoint1);
  try
    Editor_GetCaretPos(hwnd, POS_LOGICAL, LpPPoint1);
    iPosX := LpPPoint1.X;
    iPosY := LpPPoint1.Y;
  finally
    Dispose(LpPPoint1);
  end;

  //該当行の文字列を取得
  FillChar(Text, SizeOf(Text), 0);
  LineInfo.flags := POS_LOGICAL;
  LineInfo.cch := Length(Text);
  LineInfo.yLine := iPosY;
  Editor_GetLine(hwnd, @LineInfo, Text);
  sStr4 := Text;
  //設定
  sStr6 := Copy(sStr4, 1, iPosx);

  //桁位置を計算
  iNum2 := 0;
  iLen2 := 0;
  sStr9 := ' ';
  for iRow1 := 0 to iPosX-1 do
  begin
    //1文字設定
    sStr7 := MecsCopyC(sStr6, iRow1+1, 1);
    FillChar(LpBuffer, SizeOf(LpBuffer), 0);
    StrPCopy(PChar(@LpBuffer[0]), sStr7);
    //該当文字のエレメント数
    iLen3 := MecsCCSLength(sStr6, iRow1+1);
    //各エレメントの内容
    iValue1 := Ord(LpBuffer[0]);
    iValue2 := Ord(LpBuffer[1]);
    //エレメントが1以上
    if iLen3 > 1 then
    begin
      if      ((iValue1 and $D83C) = $D83C) and ((iValue2 and $DFFD) = $DFFD)  then
      begin
        iLen5 := 0;
      end
      else if ((iValue1 and $D83C) = $D83C) and ((iValue2 and $DFFF) = $DFFF)  then
      begin
        iLen5 := 0;
      end
      else
      begin
        iLen5 := 2;
      end;
    end
    //エレメントが1
    else
    begin
      if      iValue1 = $0000 then  //情報なし
      begin
        iLen5 := 0;
      end
      else if iValue1 = $200D then  //特殊文字
      begin
        iLen5 := 0;
      end
      else if iValue1 > $00FF then  //半角エリア外
      begin
        iLen5 := 2;
      end
      else if iValue1 = $0009 then  //タブ
      begin
        iLen5 := IntTabSize;
      end
      else
      begin
        iLen5 := 1;                 //該当外なので半角
      end;
    end;
    //とりあえず加算
    iLen2 := iLen2+ iLen5;

    //余り
    iMod2 := iLen2 mod IntTabSize;
    //無し
    if      iMod2 = 0 then
    begin
      iNum2 := iNum2 + iLen5;
      iLen2 := 0;
    end
    //有り
    else
    begin
      //タブ
      if iLen5 = IntTabSize then
      begin
        iNum2 := iNum2 + iLen5 - iMod2;
        iLen2 := 0;
      end
      //タブ以外
      else
      begin
        iNum2 := iNum2 + iLen5;
      end;
    end;

    //設定
    sStr9 := sStr9 + IntToStr(irow1+1) + '@' + sStr7 + '@' + IntToStr(iLen3) + '$' +
                     IntToHex(Ord(LpBuffer[0]), 4)   + '$' + IntToHex(Ord(LpBuffer[1]), 4) + ' ';
  end;

  //設定
  sStr1 := ' ' +
           Format('%d',[iPosY+1]) + ' 行, ' +
           Format('%d',[iNum2+1]) + ' 桁'   ;

  //設定
  sStr1 := sStr1 + ' ('                             +
                   Format('%d',[iPosY+1]) + ' 行, ' +
                   Format('%d',[iPosX+1]) + ' 列) ' +
                   'タブ=' + IntToStr(IntTabSize);

  //詳細
  if BoolShowDetail = TRUE then
  begin
    sStr1 := sStr1 + sStr9
  end;

  //指定桁オーバー
  if BoolShowAddMark= TRUE then
  begin
    if iNum2 > IntLineWrap then
    begin
      sStr1 := '●' + sStr1;
    end
    else
    begin
      sStr1 := '  ' + sStr1;
    end;
  end
  else
  begin
      sStr1 := '  ' + sStr1;
  end;

  //現在の内容を取得
  FillChar(OutPutText, SizeOf(OutPutText), 0);
  Editor_GetOutputString(hwnd, MAX_LINE_LENGTH, OutPutText);
  sStr2 := StrPas(OutPutText);
  //前回と異なる
  if (sStr1 <> sStr2) then
  begin
    //アウトプットバー
    if BoolShowOutPutBar= TRUE then
    begin
      Editor_OutputString(hwnd, nil, FLAG_OPEN_OUTPUT);
      Editor_OutputString(hwnd, nil, FLAG_CLEAR_OUTPUT);
      Editor_OutputString(hwnd, PChar(sStr1), FLAG_OPEN_OUTPUT);
      Editor_OutputString(hwnd, nil, FLAG_FOCUS_OUTPUT);
      Editor_ExecCommand(hwnd, MEID_WINDOW_NEXT_PANE);
      Editor_SetStatus(hwnd, nil);
    end
    //ステータスバー
    else
    begin
      Editor_SetStatus(hwnd, PChar(sStr1));
      Editor_OutputString(hwnd, nil, FLAG_CLEAR_OUTPUT);
      Editor_OutputString(hwnd, nil, FLAG_CLOSE_OUTPUT);
    end;
  end;

end;

procedure TRowColFrame.OnEvents(hwnd: HWND; nEvent: Cardinal; lParam: LPARAM);
begin
  if (nEvent and EVENT_CREATE_FRAME) <> 0 then
  begin
    //Ini
    ReadIniFile(hwnd);
    //Ini
    ReadMeryIniFile(hwnd);
    //リセット
    BoolClear := FALSE;
  end;

  if (nEvent and EVENT_CLOSE_FRAME) <> 0 then
  begin
    if FForm <> nil then
    begin
      ;
    end;
  end;

  if ((nEvent and EVENT_FILE_OPENED)       <> 0) or
     ((nEvent and EVENT_DOC_SEL_CHANGED)   <> 0) or
     ((nEvent and EVENT_IDLE)              <> 0) or
     ((nEvent and EVENT_CHANGED)           <> 0) or
     ((nEvent and EVENT_CARET_MOVED)       <> 0) then
  begin
    //Status
    ReadStatus(hwnd);
    //表示
    if ((BoolRun = TRUE) and (IntZenMode = 0))         or
       ((IntZenMode = 1) and (BoolShowZenMode = TRUE)) then
    begin
      //表示
      SetRowCol(hwnd);
      //更新
      BoolClear := TRUE;
    end
    else
    begin
      //クリア
      if BoolClear = TRUE then
      begin
        //ステータスバー
        Editor_SetStatus(hwnd, nil);
        //アウトプットバー
        Editor_OutputString(hwnd, nil, FLAG_CLEAR_OUTPUT);
        Editor_OutputString(hwnd, nil, FLAG_CLOSE_OUTPUT);
      end;
      //更新
      BoolClear := FALSE;
    end;
  end;

end;

function TRowColFrame.PluginProc(hwnd: HWND; nMsg: Cardinal; wParam: WPARAM; lParam: LPARAM): LRESULT;
var
  bResult: Boolean;
begin
  Result := 0;
  case nMsg of
    MP_QUERY_PROPERTIES:
      begin
        Result := LRESULT(QueryProperties);
      end;
    MP_SET_PROPERTIES:
      begin
        //確保
        PropatyForm := TPropatyForm.Create(Application);
        //設定
        PropatyForm.EditorHwnd := hwnd;
        //表示
        if PropatyForm.ShowModal = mrOK then
        begin
          bResult := TRUE;
        end
        else
        begin
          bResult := FALSE;
        end;
        //破棄
        PropatyForm.Free;
        //保存
        if bResult = TRUE then
        begin
          //Ini
          ReadIniFile(hwnd);
          //Ini
          ReadMeryIniFile(hwnd);
          //リセット
          BoolClear := TRUE;
          //ステータスバー
          Editor_SetStatus(hwnd, nil);
          //アウトプットバー
          Editor_OutputString(hwnd, nil, FLAG_CLEAR_OUTPUT);
          //表示
          SetRowCol(hwnd);
        end;
        //
        Result := LRESULT(SetProperties);
      end;
  end;
end;