teeinspector.pas

来自「Delphi TeeChartPro.6.01的源代码」· PAS 代码 · 共 1,252 行 · 第 1/3 页

PAS
1,252
字号
               LineTo(ARect.Right+30,tmpMiddle);
             end;
           end;
       4: begin { gradient }
            DrawEllipsis;
            tmpGrad:=TChartGradient(Item(ARow).Data);
            if tmpGrad.Visible then
            begin
              tmpCanvas:=TTeeCanvas3D.Create;
              try
                tmpCanvas.ReferenceCanvas:=Canvas;
                tmpGrad.Draw(tmpCanvas,RectangleItem);
              finally
                tmpCanvas.Free;
                {$IFDEF CLX}
                with Canvas.Brush do
                begin
                  QC:=QColor(clBtnFace);
                  try
                    QBrush_setColor(Handle, QC);
                  finally
                    QColor_destroy(QC);
                  end;
                end;
                {$ENDIF}
              end;
            end
            else DrawText(TeeMsg_None);
          end;
       6: begin { integer }
            // IntToStr(CurrentItem.HelpContext)

            DrawText(Item(ARow).Value);
          end;
       7: begin { font }
            DrawEllipsis;
            with TTeeFont(Item(ARow).Data) do
            begin
              Font.Color:=Color;
              Font.Name:=Name;
              Font.Style:=Style;
            end;

            DrawText(Font.Name);
          end;
       8: begin { image }
            DrawEllipsis;
            tmpImage:=TPicture(Item(ARow).Data);
            if Assigned(tmpImage) and Assigned(tmpImage.Graphic) then
               tmpSt:=TeeMsg_Image
            else
               tmpSt:=TeeMsg_None;

            DrawText(tmpSt);
          end;
       9: begin { pattern brush }
            DrawEllipsis;

            tmpBrush:=TChartBrush(Item(ARow).Data);

            if Assigned(tmpBrush.Image.Graphic) then
               Brush.Bitmap:=tmpBrush.Image.Bitmap
            else
               Brush.Assign(tmpBrush);

            {$IFNDEF CLX}
            if (CurrentItem<>nil) then
               SetBkColor(Handle,ColorToRGB(StrToInt(CurrentItem.Hint)));  // 6.01
            {$ENDIF}

            FillRect(RectangleItem);
            Brush.Style:=bsSolid;

            {$IFNDEF CLX}
            if (CurrentItem<>nil) then
               SetBkColor(Handle,ColorToRGB(Self.Color));  // 6.01
            {$ENDIF}
          end;
      end;
    end;
  end
  else inherited;

  {$IFDEF CLX}
  Canvas.Stop;
  {$ENDIF}
end;

procedure TTeeInspector.AddComboItem(Const S:String; AObject:TObject);
begin
  IComboGrid.Items.AddObject(S,AObject);
end;

Procedure TTeeInspector.HideCombos;
begin
  { remove previous combobox, if any }
  if Assigned(IComboGrid) then IComboGrid.Hide;
  { remove previous edit box, if any }
  if Assigned(IEditGrid) then IEditGrid.Hide;
end;

// Reload grid cells with Visible Items
procedure TTeeInspector.Rebuild;
var t   : Integer;
    tmp : Integer;
begin
  tmp:=0;
  for t:=0 to Items.Count-1 do if Items[t].Visible then Inc(tmp);
  RowCount:=Math.Max(1,tmp);

  if Header.Visible then
  begin
    tmp:=1;
    if Items.Count>0 then
       RowCount:=RowCount+1;
  end
  else tmp:=0;

  for t:=0 to Items.Count-1 do
  if Items[t].Visible then
  begin
    Cells[0,tmp]:=Items[t].Caption;
    Objects[0,tmp]:=Items[t];
    Inc(tmp);
  end;

end;

procedure TTeeInspector.Loaded;
begin
  inherited;
  Rebuild;

  if RowCount>MinRow then MoveColRow(1,MinRow,True,True);
end;

Function TTeeInspector.MinRow:Integer;
begin
  if Assigned(FHeader) and Header.Visible then result:=1
                                          else result:=0;
end;

procedure TTeeInspector.MouseDown(Button: TMouseButton; Shift: TShiftState;
                                          X, Y: Integer);
var tmp     : TObject;
    tmpR    : TRect;
    t       : Integer;
    tmpItem : TInspectorItem;
begin { execute the inspector property (menu item associated) }

  inherited;

  if (Col=1) and ValidRow(Row) then { clicked at column 1? }
  begin
    HideCombos;

    { calculate rectangle for button or checkbox }
    tmpR:=CellRect(Col,Row);

    { cell contains selection of items? }

    tmpItem:=Item(Row);
    
    if Assigned(tmpItem) then
    begin

      if (tmpItem.Style=iiString) or (tmpItem.Style=iiInteger) then
      begin
        with IEditGrid do
        begin
          { set Edit box position and size }
          DoPositionCombos(False);
          Text:=Self.Item(Row).Value;
          Show;
          SetFocus;
        end;
      end
      else

      if tmpItem.Style=iiSelection then
      begin
        { create combobox }
        with IComboGrid do
        begin
          tmp:=tmpItem.IData;

          Tag:=Integer(tmp); { menu item }

          { set ComboBox position and size }
          DoPositionCombos(False);

          { fill combobox and select item }
          Items.Clear;

          if Assigned(tmp) and (tmp is TMenuItem) then
          begin
            with TMenuItem(tmp) do
            for t:=0 to Count-1 do
            if Items[t].RadioItem then
            begin
              IComboGrid.Items.Add(StripHotKey(Items[t].Caption));
              if Items[t].Checked then
                 ItemIndex:=t;
            end;
          end
          else
          begin
            with Self.Item(Row) do
            if Assigned(FOnGetItems) then
            begin
              FOnGetItems(tmpItem,AddComboItem);
              SetComboIndex;
            end
            else ItemIndex:=-1;
          end;

          Show;
        end;
      end;

      tmpR.Right:=tmpR.Left+TeeInspectorButtonSize;

      { clicked on rectangle? }
      if PointInRect(tmpR,X,Y) then
      begin
        if tmpItem.Enabled then
        begin
          Case tmpItem.Style of
          iiBoolean: begin
                       if tmpItem.Value then tmpItem.Value:=False
                                        else tmpItem.Value:=True;
                     end;
            iiColor: tmpItem.Value:=EditColor(Self,tmpItem.Value);
             iiFont: if tmpItem.Data is TTeeFont then
                        EditTeeFontEx(Self,TTeeFont(tmpItem.Data))
                     else
                        EditTeeFont(Self,TTeeFont(tmpItem.Data));
              iiPen: EditChartPen(Self,TChartPen(tmpItem.Data));
            iiBrush: EditChartBrush(Self,TChartBrush(tmpItem.Data));
         iiGradient: EditTeeGradient(Self,TCustomTeeGradient(tmpItem.Data));
          end;

          { repaing grid cell }
          if tmpItem.StyleToInt=0 then InvalidateCell(Col,Row);
  
          tmpItem.Changed;

          if Assigned(tmpItem.IData) and (tmpItem.IData is TMenuItem) then
             TMenuItem(tmpItem.IData).Click;

          { repaint clicked grid cell }
          InvalidateCell(Col,Row);
        end;
      end;
    end; 
  end;
end;

procedure TTeeInspector.KeyDown(var Key: Word; Shift: TShiftState);
begin { emulate mouse clicking when pressing the SPACE key }
  if Key=TeeKey_Space then
     With CellRect(1,Row) do MouseDown(mbLeft,[],Left+4,Top+4)
  else
    inherited;
end;

Procedure TTeeInspector.DoPositionCombos(WhenVisible:Boolean);
var R : TRect;
begin { set inspector combobox position and size }
  R:=CellRect(Col,Row);

  if Assigned(IComboGrid) and ((not WhenVisible) or IComboGrid.Visible) then
  with IComboGrid do
  begin
    Left:=Self.Left+R.Left+1;
    Width:=R.Right-R.Left+1;
    Top:=Self.Top+R.Top-1;
  end;

  if Assigned(IEditGrid) and ((not WhenVisible) or IEditGrid.Visible) then
  with IEditGrid do
  begin
    Left:=Self.Left+R.Left+1;
    Width:=R.Right-R.Left+1;
    Height:=R.Bottom-R.Top+1;
    Top:=Self.Top+R.Top;
  end;
end;

procedure TTeeInspector.TopLeftChanged;
begin { reposition the inspector ComboBox (if visible) when scrolling }
  DoPositionCombos(True);
end;

Function TTeeInspector.ValidRow(ARow:Integer):Boolean;
begin
  if Assigned(FHeader) and Header.Visible then
     result:=ARow>0
  else
     result:=Assigned(Items) and (Items.Count>0);
end;

Function TTeeInspector.SelectCell(ACol, ARow: Integer): Boolean;
begin { Avoid selecting the first grid column (when clicking) }
  result:= (ACol>0) and
           ValidRow(ARow) and
           inherited SelectCell(ACol,ARow);
end;

procedure TTeeInspector.MouseMove(Shift: TShiftState; X, Y: Integer);
var tmpR      : TRect;
    tmp       : TGridCoord;
    tmpCursor : TCursor;
    tmpItem   : TInspectorItem;
begin
  tmpCursor:=crDefault;

  tmp:=MouseCoord(x,y); { mouse to grid Row,Col }

  if (tmp.X=1) and ValidRow(tmp.Y) then { at column 1? }
  begin
    tmpItem:=Item(tmp.Y);

    if Assigned(tmpItem) and (tmpItem.Style<>iiSelection) then
    begin
      tmpR:=CellRect(tmp.X,tmp.Y); { Row,Col to screen pixel Rect }
      tmpR.Right:=tmpR.Left+TeeInspectorButtonSize;

      { clicked on rectangle? }
      if PointInRect(tmpR,X,Y) and tmpItem.Enabled then
         tmpCursor:=crHandPoint;
    end;
  end;

  Cursor:=tmpCursor;
end;

{ TComboFlatGrid }

{$IFNDEF CLX}
procedure TComboFlatGrid.CMFocusChanged(var Message: TCMFocusChanged);
begin
  if Visible then
     if GetFocus<>Handle then Hide;
end;
{$ELSE}
function TComboFlatGrid.EventFilter(Sender: QObjectH;
  Event: QEventH): Boolean;
begin
  Result := inherited EventFilter(Sender, Event);
  if QEvent_type(Event)=QEventType_FocusOut then
     if Visible then Hide;
end;
{$ENDIF}

{ TEditGrid }

{$IFNDEF CLX}
procedure TEditGrid.CMFocusChanged(var Message: TCMFocusChanged);
begin
  if Visible then
     if GetFocus<>Handle then Hide;
end;
{$ELSE}
function TEditGrid.EventFilter(Sender: QObjectH;
  Event: QEventH): Boolean;
begin
  Result := inherited EventFilter(Sender, Event);
  if QEvent_type(Event)=QEventType_FocusOut then
     if Visible then Hide;
end;
{$ENDIF}

{ TInspectorHeader }

constructor TInspectorHeader.Create;
begin
  inherited;
  FFont:=TTeeFont.Create(CanvasChanged);
  FVisible:=True;
end;

procedure TInspectorHeader.SetFont(const Value: TFont);
begin
  FFont.Assign(Value);
end;

Procedure TInspectorHeader.CanvasChanged(Sender:TObject);
begin
  Inspector.Invalidate;
end;

procedure TInspectorHeader.SetVisible(const Value: Boolean);
begin
  if FVisible<>Value then
  begin
    FVisible:=Value;
    Inspector.InternalSetHeader;
    Inspector.Rebuild;
  end;
end;

procedure TInspectorHeader.Update;
begin
  Inspector.InternalSetHeader;
  CanvasChanged(nil);
end;

destructor TInspectorHeader.Destroy;
begin
  FFont.Free;
  inherited;
end;

end.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?