{****************************************************************** JEDI-VCL Demo Copyright (C) 2002 Project JEDI Original author: Contributor(s): You may retrieve the latest version of this file at the JEDI-JVCL home page, located at http://jvcl.delphi-jedi.org The contents of this file are used with permission, subject to the Mozilla Public License Version 1.1 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/MPL-1_1Final.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. ******************************************************************} unit JvComboListBoxDemoForm; {$mode objfpc}{$H+} interface uses //Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, //JvComponent, JvClipboardViewer, ExtCtrls, ExtDlgs, ComCtrls, Menus, JvComboListBox; //, JvExForms; type { TJvComboListBoxDemoFrm } TJvComboListBoxDemoFrm = class(TForm) // JvClipboardViewer1: TJvClipboardViewer; Splitter1: TSplitter; Panel1: TPanel; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Memo1: TMemo; pnlImage: TPanel; Image1: TImage; btnLoadImage: TButton; btnCopyImage: TButton; btnCopyText: TButton; edItemHeight: TEdit; udItemHeight: TUpDown; cbDrawStyle: TComboBox; edButtonWidth: TEdit; udButtonWidth: TUpDown; btnLoadText: TButton; OpenPictureDialog1: TOpenPictureDialog; PopupMenu1: TPopupMenu; mnuPaste: TMenuItem; mnuDelete: TMenuItem; N1: TMenuItem; mnuOriginal: TMenuItem; mnuStretch: TMenuItem; mnuProportional: TMenuItem; OpenDialog1: TOpenDialog; chkHotTrackCombo: TCheckBox; edColumns: TEdit; Label5: TLabel; udColumns: TUpDown; chkInsert: TCheckBox; cbPopupAlign: TComboBox; Label6: TLabel; chkCustomDrop: TCheckBox; chkIncludeFiles: TCheckBox; { procedure JvClipboardViewer1Image(Sender: TObject; Image: TBitmap); procedure JvClipboardViewer1Text(Sender: TObject; Text: string); } procedure btnCopyTextClick(Sender: TObject); procedure btnCopyImageClick(Sender: TObject); procedure btnLoadImageClick(Sender: TObject); procedure Memo1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure udItemHeightClick(Sender: TObject; Button: TUDBtnType); procedure FormCreate(Sender: TObject); procedure mnuPasteClick(Sender: TObject); procedure mnuDeleteClick(Sender: TObject); procedure cbDrawStyleChange(Sender: TObject); procedure mnuProportionalClick(Sender: TObject); procedure PopupMenu1Popup(Sender: TObject); procedure udButtonWidthClick(Sender: TObject; Button: TUDBtnType); procedure btnLoadTextClick(Sender: TObject); procedure chkHotTrackComboClick(Sender: TObject); procedure udColumnsClick(Sender: TObject; Button: TUDBtnType); procedure cbPopupAlignChange(Sender: TObject); procedure chkIncludeFilesClick(Sender: TObject); private LB: TJvComboListBox; procedure DoDropDown(Sender: TObject; AIndex, X, Y: integer; var AllowDrop:boolean); procedure DoAccept(Sender: TObject; Index: integer; const Value: string); public procedure UpdateFromClipboardText; procedure UpdateFromClipboardImage; end; var JvComboListBoxDemoFrm: TJvComboListBoxDemoFrm; implementation uses Math, Clipbrd, DropFrm; {$R *.lfm} function Max(Values: array of integer): integer; var i: integer; begin Result := Values[Low(Values)]; for i := Low(Values) + 1 to High(Values) do if Values[i] > Result then Result := Values[i]; end; (* procedure TJvComboListBoxDemoFrm.JvClipboardViewer1Image(Sender: TObject; Image: TBitmap); var P: TPicture; begin P := TPicture.Create; try P.Assign(Image); if chkInsert.Checked then LB.InsertImage(0, P) else LB.AddImage(P); finally P.Free; // AddImage creates a copy, so we can free this instance end; // LB.ItemHeight := Max(LB.ItemHeight, B.Height + 8); udItemHeight.Position := LB.ItemHeight; Caption := Format('Count: %d', [LB.Items.Count]); end; procedure TJvComboListBoxDemoFrm.JvClipboardViewer1Text(Sender: TObject; Text: string); begin if chkInsert.Checked then LB.InsertText(0, StringReplace(Text, #13#10, ' ', [rfReplaceAll])) else LB.AddText(StringReplace(Text, #13#10, ' ', [rfReplaceAll])); Caption := Format('Clipboard count: %d', [LB.Items.Count]); end; *) procedure TJvComboListboxDemoFrm.UpdateFromClipboardText; var txt: String; begin txt := Clipboard.AsText; if chkInsert.Checked then LB.InsertText(0, StringReplace(txt, LineEnding, ' ', [rfReplaceAll])) else LB.AddText(StringReplace(txt, LineEnding, ' ', [rfReplaceAll])); Caption := Format('Clipboard count: %d', [LB.Items.Count]); end; procedure TJvComboListBoxDemoFrm.UpdateFromClipboardImage; var P: TPicture; begin P := TPicture.Create; try P.LoadFromClipboardFormat(CF_BITMAP); if chkInsert.Checked then LB.InsertImage(0, P) else LB.AddImage(P); finally P.Free; // AddImage creates a copy, so we can free this instance end; udItemHeight.Position := LB.ItemHeight; Caption := Format('Clipboard count: %d', [LB.Items.Count]); end; procedure TJvComboListBoxDemoFrm.btnCopyTextClick(Sender: TObject); begin if Memo1.SelLength = 0 then Memo1.SelectAll; Memo1.CopyToClipboard; UpdateFromClipboardText; end; procedure TJvComboListBoxDemoFrm.btnCopyImageClick(Sender: TObject); var // AFormat: Word; // AData: Cardinal; // APalette: HPALETTE; il: TImageList; begin (* if Image1.Picture.Graphic is TIcon then begin // convert ico to bmp il := TImageList.CreateSize(Image1.Picture.Width, Image1.Picture.Height); try il.AddIcon(Image1.Picture.Icon); il.GetBitmap(0, Image1.Picture.Bitmap); finally il.Free; end; end; *) Image1.Picture.SaveToClipboardFormat(CF_BITMAP); UpdateFromClipboardImage; { original: Image1.Picture.SaveToClipboardFormat(AFormat, AData, APalette); Clipboard.SetAsHandle(AFormat, AData); } end; procedure TJvComboListBoxDemoFrm.btnLoadImageClick(Sender: TObject); begin if OpenPictureDialog1.Execute then Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName); end; procedure TJvComboListBoxDemoFrm.Memo1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (ssCtrl in Shift) then begin if (Key = ord('C')) or (Key = ord('c')) then begin Memo1.CopyToClipboard; JvComboListboxDemoFrm.UpdateFromClipboardText; end else if (Key = ord('X')) or (Key = ord('x')) then begin Memo1.CutToClipboard; JvComboListboxDemoFrm.UpdateFromClipboardText; end; end; end; procedure TJvComboListBoxDemoFrm.udItemHeightClick(Sender: TObject; Button: TUDBtnType); begin LB.ItemHeight := udItemHeight.Position; end; procedure TJvComboListBoxDemoFrm.DoAccept(Sender:TObject;Index:integer; const Value:string); begin if Index < 0 then Index := LB.ItemIndex; if Index >= 0 then begin LB.Items.Objects[Index].Free; LB.Items.Objects[Index] := nil; LB.Items[Index] := Value; end; end; procedure TJvComboListBoxDemoFrm.DoDropDown(Sender: TObject; AIndex, X,Y:integer; var AllowDrop:boolean); var R:TRect; P:TPoint; begin AllowDrop := not chkCustomDrop.Checked; mnuOriginal.Enabled := Lb.Items.Objects[AIndex] <> nil; mnuStretch.enabled := LB.Items.Objects[AIndex] <> nil; mnuProportional.Enabled := LB.Items.Objects[AIndex] <> nil; if not AllowDrop then begin R := LB.ItemRect(AIndex); P := LB.ClientToScreen(Point(R.Right, R.Top)); if frmDrop = nil then frmDrop := TfrmDrop.Create(Application); with frmDrop do begin IncludeFiles := chkIncludeFiles.Checked; Top := P.Y + LB.ItemHeight; Left := P.X - Width; // notify dialog when the user clicks outside the form OnAccept := @DoAccept; Show; end; end; end; procedure TJvComboListBoxDemoFrm.FormCreate(Sender: TObject); begin LB := TJvComboListBox.Create(Self); LB.Align := alClient; LB.Width := 200; LB.Parent := Self; LB.DropDownMenu := PopupMenu1; LB.OnDropDown := @DoDropDown; // LB.ScrollBars := ssBoth; // LB.HotTrack := true; Splitter1.Left := LB.Left - 10; cbDrawStyle.ItemIndex := Ord(LB.DrawStyle); cbPopupAlign.ItemIndex := Ord(PopupMenu1.Alignment); LB.ItemHeight := udItemHeight.Position; udButtonWidth.Position := LB.ButtonWidth; udColumns.Position := LB.Columns; end; procedure TJvComboListBoxDemoFrm.mnuPasteClick(Sender: TObject); begin with LB do begin if Items.Objects[ItemIndex] <> nil then Image1.Picture.Assign(TPicture(Items.Objects[ItemIndex])) else Memo1.Lines.Text := Items[ItemIndex]; end; end; procedure TJvComboListBoxDemoFrm.mnuDeleteClick(Sender: TObject); begin with LB do if ItemIndex >= 0 then Delete(ItemIndex); Caption := Format('Clipboard count: %d', [LB.Items.Count]); end; procedure TJvComboListBoxDemoFrm.cbDrawStyleChange(Sender: TObject); begin LB.DrawStyle := TJvComboListBoxDrawStyle(cbDrawStyle.ItemIndex); end; procedure TJvComboListBoxDemoFrm.mnuProportionalClick(Sender: TObject); begin cbDrawStyle.ItemIndex := (Sender as TMenuItem).Tag; LB.DrawStyle := TJvComboListBoxDrawStyle(cbDrawStyle.ItemIndex); (Sender as TMenuItem).Checked := true; end; procedure TJvComboListBoxDemoFrm.PopupMenu1Popup(Sender: TObject); var i: integer; begin for i := 0 to PopupMenu1.Items.Count - 1 do if PopupMenu1.Items[i].GroupIndex = 1 then PopupMenu1.Items[i].Checked := PopupMenu1.Items[i].Tag = cbDrawStyle.ItemIndex; end; procedure TJvComboListBoxDemoFrm.udButtonWidthClick(Sender: TObject; Button: TUDBtnType); begin LB.ButtonWidth := udButtonWidth.Position; end; procedure TJvComboListBoxDemoFrm.btnLoadTextClick(Sender: TObject); begin if OpenDialog1.Execute then Memo1.Lines.LoadFromFile(OpenDialog1.FileName); end; procedure TJvComboListBoxDemoFrm.chkHotTrackComboClick(Sender: TObject); begin LB.HotTrackCombo := chkHotTrackCombo.Checked; end; procedure TJvComboListBoxDemoFrm.udColumnsClick(Sender: TObject; Button: TUDBtnType); begin LB.Columns := udColumns.Position; end; procedure TJvComboListBoxDemoFrm.cbPopupAlignChange(Sender: TObject); begin PopupMenu1.Alignment := TPopupAlignment(cbPopupAlign.ItemIndex); end; procedure TJvComboListBoxDemoFrm.chkIncludeFilesClick(Sender: TObject); begin if frmDrop <> nil then //recreate form begin frmDrop.Release; frmDrop := nil; end; end; end.