2014-04-16 8 views
3

특정 줄을 표시하는 플러그인을 작성 중이며 코드 편집기 위에 특정 줄의 강조 표시를 칠하려고합니다. 이를 위해 특정 코드 행, 즉 버퍼의 행에 대한 화면상의 위치를 ​​계산해야합니다.코드 편집기에서 코드 접기를 추적하는 방법은 무엇입니까?

델파이 코드 편집기는 IOTAEditViewBottomRowTopRow 속성을 통해 화면에 어떤 선이 표시되는지 액세스 할 수 있습니다. 그러나 최신 IDE 버전에서는 코드 영역과 메서드를 접을 수 있습니다. 즉, 여러 줄을 하나로 접을 수 있습니다. 라인 하이라이트 페인팅의 첫 번째 단계는 어떤 선들이 보이고 어디에 있는지를 아는 것입니다. 이렇게하려면 편집기의 어느 부분이 접혀 있고 어떤 부분이 접히지 않았는지 추적해야합니다. 코드 폴딩 (elision)을 호출하는 OTAPI 메소드가 있지만 발생 시점을 알 수는없는 것 같습니다.

그러나 Castalia와 같은 일부 플러그인은이를 관리합니다. 어떻게 할 수 있습니까?

+0

CnPack 소스를 사용해보십시오. –

+0

감사합니다. @DavidHeffernan, 알겠습니다. 필자가 판매하고자하는 플러그인을 작성 중이지만 비상업적 인 오픈 소스 코드를주의 깊게 살펴 봐야합니다. (a) 상업용 제품에 사용할 수 있고 (b) 상업용 친숙한 오픈 소스 라이브러리에 캡슐화 할 수있는 방식으로 독자적으로 파악하고 싶습니다. 그래서 다른 사람들이 상업용 제품과 상호 작용하는 플러그인을 작성할 수 있습니다. 코드 편집기도. –

답변

4

IDE 편집기 컨트롤에는 방법이 IsLineElided 있습니다. Elision [*]은 붕괴 된 영역, 메서드 또는 다른 구조의 일부인 경우 숨겨진 행에 대한 IDE의 내부 용어입니다. UI에서는 이것을 "코드 접기"와 같이 "접기"라고하지만 사용자에게 표시되는 UI 용어와는 다른 내부 용어로 사용하는 것이 일반적입니다.

이 방법은 공개적으로 액세스 할 수 없습니다. 내부 TEditControl 클래스의 메서드입니다. 이를 사용하려면 IDE 메소드를 호출해야합니다. 많은 IDE 해킹과 달리, 당신은 행동을 바꿀 필요가 없기 때문에 그것을 훅 할 필요가 없습니다. 그냥 호출하십시오.

  • 변환 된 이름 : 방법의 프로토 타입 @[email protected]@LineIsElided$qqri
  • 다음 coreide * 확장자 .bpl 파일에있는 TLineIsElidedProc = function(Self: TObject; LineNum: Integer): Boolean;
  • . 예를 들어

,

PFLineIsElided := GetProcAddress(CoreIDEHandle, StrIDELineIsElidedName); 

당신은 reading loaded modules하여 핵심 IDE BPL 핸들을 얻을 수 있습니다. 첫 번째 매개 변수는 ToolsAPI 편집보기가 아닌 편집기 편집기 창이어야하지만 내부 편집기 여야합니다. 이 기사에서는 the relationship between the editor control and IOTAEditView을 보여줍니다. 라인이 생략되는 경우

는 이제 (숨겨져 즉입니까?) 요청하실 수 있습니다 플러그인에서과 같이 그러나

if PFLineIsElided(FCodeEditor, 123) then ... 

, 즉 함께 지역 접혀있는 볼 퍼팅 - 또는 오히려, 접힌 영역의 맨 위 줄이 그려지기 때문에 하나 이상의 줄이 생략 된 줄을 찾으려면 약간 더 많은 논리가 필요합니다. 가장 좋은 방법은 화면상의 줄을 따라 반복하는 것입니다 (IOTAEditView.TopRowBottomRow). 당신이보고있는 라인이 접혀 있지만 당신이보고있는 라인이 아닌 경우, 당신이보고있는 라인은 접힌 구역의 대표 라인입니다 (+/- 시궁창에있는 기호)

코드 편집기에서 페인팅하는 경우 논리적 줄 번호 (코드 거터에 인쇄 된 줄 번호)와 공칭 줄 번호 (보기의 화면에 보이는 줄) 사이의 차이는 코드 elision이 이것을 제어합니다. 코드가 접히면 논리적 및 공칭 행 번호가 일치하지 않습니다. 편집 뷰는 항상 공칭 행 번호를 순서대로 그립니다. 그러나 중간에 접힌 영역이 있으면 논리 행 번호에 간격이 생깁니다.

추가 읽기 :article about integrating with the code editor, 그 중 하나는 코드 접기 및 줄 번호 처리에 대해 설명합니다. Parnassus 블로그의 코드 편집기와 통합 된 Delphi 플러그인/마법사에 관한 주제 중 두 개 중 하나입니다. 비록 접힌 코드보다 더 많은 것을 다루지 만 이런 종류의 것들을 다루어야하는 IDE 플러그인을 작성한다면 거기에 많은 유용한 자료가 있습니다. (면책 조항 : 내 블로그.)

[*]은 제쳐두고, 생략가 자동 반의어이므로 : 어느 쪽이 의미를 가진 단어 (. 일반적인 예는 '쪼개짐'이다) 한 의미 elision은 생략 또는 제거이고 다른 의미는 합치거나 합치는 것입니다.

관련 문제