3

開発中の Eclipse プラグインで、テキスト エディターの背景にボックスをペイントしようとしています。なんとかできましたが、問題は、テキストエディターでコードをスクロールしているときに、スクロールしている方向にもボックスが移動していることです。ボックスを初期位置に保つ方法を知っている人はいますか? 描画用の私のコードは次のとおりです。

<!-- language: lang-java -->

    public class BoxHighLighting {

    protected StyledText boxText;
    private Color bc;
    int startingChar;
    int endingChar; 


    public BoxHighLighting(StyledText boxText, int startingChar, int endingChar, Color color){
        this.boxText = boxText;
        this.startingChar = startingChar;
        this.endingChar = endingChar;
        bc = color;
        setStyledText();
    }

    public void setStyledText() {

        //boxText.getOffsetAtLine(3);

        if (boxText == null)
            return;

        Rectangle r0 = boxText.getClientArea();

        if ((r0.width < 1) || (r0.height < 1)) {
            return;
        }
        int xOffset = this.boxText.getHorizontalPixel();
        int yOffset = this.boxText.getTopPixel();

        Image newImage = new Image(null, r0.width, r0.height);
        GC gc = new GC(newImage);
        Rectangle rec = boxText.getTextBounds(startingChar, endingChar);
        Rectangle editorWin = newImage.getBounds();
        fillRectangle(bc, gc, rec.x, rec.y, editorWin.width, rec.height);
        gc.drawRectangle(rec.x, rec.y, editorWin.width, rec.height);
        Image oldImage = this.boxText.getBackgroundImage();
        this.boxText.setBackgroundImage(newImage);
        if (oldImage != null)
            oldImage.dispose();
        gc.dispose();
    }

    void fillRectangle(Color c, GC gc, int x, int y, int width, int height) {
        if (c == null) {
            return;
        }
         gc.setBackground(c);
                 gc.fillRoundRectangle(x, y, width, height, 5, 5);

    }
}
4

1 に答える 1

4

ITextEditor StyledText プロパティにペイント リスナーを配置し、スクロールの x、y 位置が変更されたことを検出し、人がスクロールするときにボックスを再描画できます。

styledText.addPaintListener(new PaintListener() {
    private int oldXOffset = 0;
    private int oldYOffset = 0;

    private boolean offsetMoved(int xOffset, int yOffset) {
       if ((xOffset != oldXOffset) || (yOffset != oldYOffset)) {
         oldXOffset = xOffset;
         oldYOffset = yOffset;
         return true;
       }
       return false;
    }

    public void paintControl(PaintEvent event) {
        if(event.getSource() instanceof StyledText)  {
            StyledText st = (StyledText) event.getSource();
            if(offsetMoved(st.getHorizontalPixel(), st.getTopPixel())) {
                    // do a redraw of the rectangles here!!!!
            }
         }
    }

});

于 2012-05-22T14:19:09.423 に答える