⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 editu2.pas

📁 一个mwEdit控件原码,比mwCuuEdit0.92a功能先进.
💻 PAS
📖 第 1 页 / 共 4 页
字号:
    clActiveBorder, clInactiveBorder, clAppWorkSpace, clHighlight,
    clHighlightText, clBtnFace, clBtnShadow, clGrayText, clBtnText,
    clInactiveCaptionText, clBtnHighlight, cl3DDkShadow, cl3DLight,
    clInfoText, clInfoBk, clNone);

function ColorToIndex(AColor: TColor): integer;
var
  i: integer;
begin
  Result := 0;
  for i := Low(Colors) to High(Colors) do
    if Colors[i] = AColor then begin
      Result := i - 1;
      break;
    end;
end;

function IndexToColor(AIndex: integer): TColor;
begin
  Result := Colors[AIndex + 1];
end;

{ TDemoMainForm }

procedure TDemoMainForm.FormCreate(Sender: TObject);
var
  s: string;
  AColors: TStringList;
  i: integer;
begin
  fHighlighters := TStringList.Create;
  GetHighlighters(Self, fHighlighters, FALSE);
  EnumerateExporters;
  UpdateKeystrokesList;
  // setup highlighter selection combobox
  cbxHighlighterSelect.Items.Assign(fHighlighters);
  cbxHighlighterSelect.Items.Insert(0, '(none)');
  // setup file open dialog filter
  s := GetHighlightersFilter(fHighlighters);
  if (s <> '') and (s[Length(s)] <> '|') then
    s := s + '|';
  s := s + 'All files (*.*)|*.*';
  OpenDialog1.Filter := s;
  // fill comboboxes with color strings
  AColors := TStringList.Create;
  try
    for i := Low(Colors) to High(Colors) do begin
      if ColorToIdent(Colors[i], s) then
        AColors.Add(s);
    end;
    cbxREColor.Items.Assign(AColors);
    cbxColor.Items.Assign(AColors);
    cbxForeground.Items.Assign(AColors);
    cbxBackground.Items.Assign(AColors);
    cbxGutterColor.Items.Assign(AColors);
    cbxAttrForeground.Items.Assign(AColors);
    cbxAttrBackground.Items.Assign(AColors);
    cbxCompletionColor.Items.Assign(AColors);
  finally
    AColors.Free;
  end;
  // initialization of other controls
  PageControl1.ActivePage := tabFile;
  FontDialog1.Font.Assign(SynEditor.Font);

  fMarkButtons[0] := SpeedButton1;
  fMarkButtons[1] := SpeedButton2;
  fMarkButtons[2] := SpeedButton3;
  fMarkButtons[3] := SpeedButton4;
  fMarkButtons[4] := SpeedButton5;
  
  //intializes a search engine
  SynEditor.SearchEngine := TSynEditSearch.Create( SynEditor );
end;

procedure TDemoMainForm.FormDestroy(Sender: TObject);
begin
  fHighlighters.Free;
end;

procedure TDemoMainForm.FormShow(Sender: TObject);
begin
  if not fShown then begin
    fShown := TRUE;
    UpdateEditorSettings;
    cbxHighlighterSelect.ItemIndex := 0;
    cbxHighlighterSelectChange(Sender);
    // update the statusbar panels
    SynEditorStatusChange(Self, [scAll]);
  end;
end;

procedure TDemoMainForm.FormResize(Sender: TObject);
begin
  inpGutterWidth.MaxValue := SynEditor.Width + 1;
  if inpGutterWidth.Value > inpGutterWidth.MaxValue then
    inpGutterWidth.Value := inpGutterWidth.MaxValue;
end;

procedure TDemoMainForm.EnumerateExporters;
var
  i: integer;
  s: string;
begin
  cbxExporterSelect.Items.Add('(All registered formats)');
  for i := 0 to ComponentCount - 1 do begin
    if not (Components[i] is TSynCustomExporter) then
      continue;
    s := (Components[i] as TSynCustomExporter).FormatName;
    if s <> '' then
      cbxExporterSelect.Items.Add(s);
  end;    
  cbxExporterSelect.ItemIndex := 0;
  cbxExporterSelectChange(Self);
end;

function TDemoMainForm.GetSelectedExporter: TSynCustomExporter;
var
  i: integer;
begin
  for i := 0 to ComponentCount - 1 do begin
    if not (Components[i] is TSynCustomExporter) then
      continue;
    Result := TSynCustomExporter(Components[i]);
    if Result.FormatName = cbxExporterSelect.Text then
      exit;
  end;
  Result := nil;
end;

procedure TDemoMainForm.LoadFile(const AFileName: string; AReadOnly: boolean);
var
  backCursor: TCursor;
  bWasText: boolean;
begin
  backCursor := Cursor;
  try
    Cursor := crHourGlass;
    Windows.SetCursor(Screen.Cursors[crHourGlass]);

    fFileName := AFileName;
    outFilename.Caption := AFileName;
    outFilename.Visible := TRUE;
    with SynEditor do begin
      Highlighter := GetHighlighterFromFileExt(fHighlighters,
        ExtractFileExt(AFileName));
      with cbxHighlighterSelect do begin
        if Highlighter <> nil then
          ItemIndex := Items.IndexOf(Highlighter.LanguageName)
        else
          ItemIndex := 0;
      end;
      cbxHighlighterSelectChange(Self);
      if Highlighter = SynDfmSyn1 then
        LoadDFMFile2Strings(AFileName, SynEditor.Lines, bWasText)
      else
        Lines.LoadFromFile(AFileName);
      Modified := FALSE;
      ReadOnly := AReadOnly;
      cbReadonly.Checked := AReadOnly;
      SetFocus;
    end;
  finally
    Cursor := backCursor;
  end;
end;

procedure TDemoMainForm.LogEvent(AEvent: string);
begin
  if cbEnableEventLog.Checked then
    lbEventLog.Items.Insert(0, TimeToStr(Now) + ' ' + AEvent);
end;

procedure TDemoMainForm.RebuildMarks;
var
  i: integer;
begin
  with SynEditor do begin
    BeginUpdate;
    try
      for i := 0 to Marks.Count-1 do begin
        if Marks[i].IsBookmark then
          Marks[i].InternalImage := cbInternalImages.Checked;
      end;
    finally
      EndUpdate;
    end;
  end;
end;

procedure TDemoMainForm.RecalcLeftMargin;

  procedure ValidateSpinEditValue(SE: TSpinEdit; Value: integer);
  begin
    if SE.Value <> Value then SE.Value := Value;
  end;

begin
  with SynEditor do begin
    inpLeftMargin.MaxValue := Gutter.Width;
    if inpLeftMargin.Value > inpLeftMargin.MaxValue then
      inpLeftMargin.Value := inpLeftMargin.MaxValue;
    ValidateSpinEditValue(inpGutterWidth, Gutter.Width);
    ValidateSpinEditValue(inpDigitCount, Gutter.DigitCount);
    ValidateSpinEditValue(inpLeftOffset, Gutter.LeftOffset);
    ValidateSpinEditValue(inpRightOffset, Gutter.RightOffset);
  end;
end;

procedure TDemoMainForm.ReloadAttributes;
var
  i: integer;
begin
  if SynEditor.Highlighter <> nil then begin
    cbxAttrSelect.Items.Clear;
    for i := 0 to SynEditor.Highlighter.AttrCount - 1 do
      cbxAttrSelect.Items.Add(SynEditor.Highlighter.Attribute[i].Name);
    cbxAttrSelect.ItemIndex := 0;
  end;
  cbxAttrSelectChange(Self);
end;

procedure TDemoMainForm.ResetMarkButtons;
var
  marks: TSynEditMarks;
  i: integer;
begin
  fDisableMarkButtons := true;
  try
    SynEditor.Marks.GetMarksForLine(SynEditor.CaretY, marks);
    for i := 0 to 4 do
      fMarkButtons[i].Down := false;
    for i := 1 to maxMarks do begin
      if not assigned(marks[i]) then break;
      if not marks[i].IsBookmark then
        fMarkButtons[marks[i].ImageIndex-10].Down := true;
    end;
  finally
    fDisableMarkButtons := false;
  end;
end;

procedure TDemoMainForm.ShowSuccess(ASuccess: boolean);
begin
  if ASuccess then
    StatusBar.Panels[3].Text := 'Success'
  else
    StatusBar.Panels[3].Text := 'Failure';
end;

procedure TDemoMainForm.UpdateCanExport;
begin
  btnExportToClipboard.Enabled := SynEditor.Highlighter <> nil;
  btnExportToFile.Enabled := (SynEditor.Highlighter <> nil)
    and (cbxExporterSelect.ItemIndex > 0);
end;

procedure TDemoMainForm.UpdateEditorSettings;
begin
  with SynEditor do begin
    cbReadonly.Checked := ReadOnly;
    cbHideSelection.Checked := HideSelection;
    cbScrollPastEOL.Checked := eoScrollPastEOL in Options;
    cbHalfPageScroll.Checked := eoHalfPageScroll in Options;
    inpExtraLineSpacing.Value := ExtraLineSpacing;
    inpRightEdge.Value := RightEdge;
    cbxREColor.ItemIndex := ColorToIndex(RightEdgeColor);
    cbxScrollBars.ItemIndex := Ord(Scrollbars);
    with SynEditor.Font do
      btnFont.Caption := Name + ' ' + IntToStr(Size);
    cbxColor.ItemIndex := ColorToIndex(Color);
    cbxForeground.ItemIndex := ColorToIndex(SelectedColor.Foreground);
    cbxBackground.ItemIndex := ColorToIndex(SelectedColor.Background);
    cbAutoIndent.Checked := eoAutoIndent in Options;
    cbWantTabs.Checked := WantTabs;
    inpTabWidth.Value := TabWidth;
    cbDragDropEdit.Checked := eoDragDropEditing in Options;
    cbxInsertCaret.ItemIndex := Ord(InsertCaret);
    cbxOverwriteCaret.ItemIndex := Ord(OverwriteCaret);
    cbInsertMode.Checked := InsertMode;
    cbxGutterColor.ItemIndex := ColorToIndex(Gutter.Color);
    inpGutterWidth.Value := Gutter.Width;
    inpDigitCount.Value := Gutter.DigitCount;
    inpLeftOffset.Value := Gutter.LeftOffset;
    inpRightOffset.Value := Gutter.RightOffset;
    cbLineNumbers.Checked := Gutter.ShowLineNumbers;
    cbLeadingZeros.Checked := Gutter.LeadingZeros;
    cbZeroStart.Checked := Gutter.ZeroStart;
    cbAutoSize.Checked := Gutter.AutoSize;
    cbGutterVisible.Checked := Gutter.Visible;
    cbUseFontStyle.Checked := Gutter.UseFontStyle;
    cbEnableKeys.Checked := BookMarkOptions.EnableKeys;
    cbGlyphsVisible.Checked := BookMarkOptions.GlyphsVisible;
    cbInternalImages.Checked := BookMarkOptions.BookmarkImages = nil;
    inpLeftMargin.Value := BookMarkOptions.LeftMargin;
    inpXOffset.Value := BookmarkOptions.XOffset;
    inpMaxUndo.Value := MaxUndo;
    cbxAttrSelect.ItemIndex := 0;
    cbxAttrSelectChange(Self);
  end;
end;

procedure TDemoMainForm.UpdateKeystrokesList;
var
  i: integer;
begin
  with KeyCmdList.Items do begin
    BeginUpdate;
    try
      Clear;
      for i := 0 to SynEditor.Keystrokes.Count - 1 do
        with Add do begin
          Caption := EditorCommandToCodeString(SynEditor.Keystrokes[i].Command);
          if SynEditor.Keystrokes[i].ShortCut = 0 then
            SubItems.Add('<none>')
          else
            SubItems.Add(Menus.ShortCutToText(SynEditor.Keystrokes[i].ShortCut));
        end;
    finally
      EndUpdate;
    end;
  end;
end;

procedure TDemoMainForm.btnLoadClick(Sender: TObject);
begin
  if OpenDialog1.Execute then
    LoadFile(OpenDialog1.FileName, ofReadOnly in OpenDialog1.Options);
  SynEditor.SetFocus;
end;

procedure TDemoMainForm.cbReadonlyClick(Sender: TObject);
begin
  SynEditor.ReadOnly := cbReadonly.Checked;
  SynEditor.SetFocus;
end;

procedure TDemoMainForm.cbHideSelectionClick(Sender: TObject);
begin
  SynEditor.HideSelection := cbHideSelection.Checked;
  SynEditor.SetFocus;
end;

procedure TDemoMainForm.cbScrollPastEOLClick(Sender: TObject);
begin
  SynEditor.SetOptionFlag(eoScrollPastEol, cbScrollPastEOL.Checked);
  SynEditor.SetFocus;
end;

procedure TDemoMainForm.cbHalfPageScrollClick(Sender: TObject);
begin
  SynEditor.SetOptionFlag(eoHalfPageScroll, cbHalfPageScroll.Checked);
  SynEditor.SetFocus;
end;

procedure TDemoMainForm.inpExtraLineSpacingChange(Sender: TObject);
begin
  try SynEditor.ExtraLineSpacing := inpExtraLineSpacing.Value;
  except end;
  SynEditor.SetFocus;
end;

procedure TDemoMainForm.inpRightEdgeChange(Sender: TObject);
begin
  try SynEditor.RightEdge := inpRightEdge.Value;
  except end;
  RecalcLeftMargin;
  SynEditor.SetFocus;
end;

procedure TDemoMainForm.cbxREColorChange(Sender: TObject);
begin
  SynEditor.RightEdgeColor := IndexToColor(cbxREColor.ItemIndex);
  SynEditor.SetFocus;
end;

procedure TDemoMainForm.cbxScrollBarsChange(Sender: TObject);
begin
  SynEditor.Scrollbars := TScrollStyle(cbxScrollBars.ItemIndex);
  SynEditor.SetFocus;
end;

procedure TDemoMainForm.cbxColorChange(Sender: TObject);
begin
  SynEditor.Color := IndexToColor(cbxColor.ItemIndex);
  SynEditor.SetFocus;
end;

procedure TDemoMainForm.cbxForegroundChange(Sender: TObject);
begin
  SynEditor.SelectedColor.Foreground := IndexToColor(cbxForeground.ItemIndex);
  SynEditor.SetFocus;
end;

procedure TDemoMainForm.cbxBackgroundChange(Sender: TObject);
begin
  SynEditor.SelectedColor.Background := IndexToColor(cbxBackground.ItemIndex);
  SynEditor.SetFocus;
end;

procedure TDemoMainForm.btnFontClick(Sender: TObject);
begin
  if FontDialog1.Execute then begin
    SynEditor.Font.Assign(FontDialog1.Font);
    UpdateEditorSettings;
    SynEditor.SetFocus;
  end;
end;

procedure TDemoMainForm.cbAutoIndentClick(Sender: TObject);
begin
  SynEditor.SetOptionFlag(eoAutoIndent, cbAutoIndent.Checked);
  SynEditor.SetFocus;
end;

procedure TDemoMainForm.cbWantTabsClick(Sender: TObject);
begin
  SynEditor.WantTabs := cbWantTabs.Checked;
  SynEditor.SetFocus;
end;

⌨️ 快捷键说明

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