cximagelisteditor.pas

来自「胜天进销存源码,国产优秀的进销存」· PAS 代码 · 共 1,122 行 · 第 1/3 页

PAS
1,122
字号

{********************************************************************}
{                                                                    }
{           Developer Express Visual Component Library               }
{           Express Cross Platform Library classes                   }
{                                                                    }
{           Copyright (c) 2000-2008 Developer Express Inc.           }
{           ALL RIGHTS RESERVED                                      }
{                                                                    }
{   The entire contents of this file is protected by U.S. and        }
{   International Copyright Laws. Unauthorized reproduction,         }
{   reverse-engineering, and distribution of all or any portion of   }
{   the code contained in this file is strictly prohibited and may   }
{   result in severe civil and criminal penalties and will be        }
{   prosecuted to the maximum extent possible under the law.         }
{                                                                    }
{   RESTRICTIONS                                                     }
{                                                                    }
{   THIS SOURCE CODE AND ALL RESULTING INTERMEDIATE FILES            }
{   (DCU, OBJ, DLL, ETC.) ARE CONFIDENTIAL AND PROPRIETARY TRADE     }
{   SECRETS OF DEVELOPER EXPRESS INC. THE REGISTERED DEVELOPER IS    }
{   LICENSED TO DISTRIBUTE THE EXPRESSCROSSPLATFORMLIBRARY AND ALL   }
{   ACCOMPANYING VCL CONTROLS AS PART OF AN EXECUTABLE PROGRAM       }
{   ONLY.                                                            }
{                                                                    }
{   THE SOURCE CODE CONTAINED WITHIN THIS FILE AND ALL RELATED       }
{   FILES OR ANY PORTION OF ITS CONTENTS SHALL AT NO TIME BE         }
{   COPIED, TRANSFERRED, SOLD, DISTRIBUTED, OR OTHERWISE MADE        }
{   AVAILABLE TO OTHER INDIVIDUALS WITHOUT EXPRESS WRITTEN CONSENT   }
{   AND PERMISSION FROM DEVELOPER EXPRESS INC.                       }
{                                                                    }
{   CONSULT THE END USER LICENSE AGREEMENT FOR INFORMATION ON        }
{   ADDITIONAL RESTRICTIONS.                                         }
{                                                                    }
{********************************************************************}

unit cxImageListEditor;

{$I cxVer.inc}

interface

uses
  dxGDIPlusAPI, dxGDIPlusClasses,
  Windows, SysUtils, Classes, ImgList, ComCtrls, Controls, Graphics, Forms, Dialogs,
  cxClasses, cxGeometry, cxGraphics;

type
  TcxEditorImageInfo = class(TcxImageInfo)
  private
    FAlphaUsed: Boolean;
  protected
    procedure SetImage(Value: TBitmap); override;
  public
    property AlphaUsed: Boolean read FAlphaUsed;
  end;

  TcxImageFileFormat = record
    Name: string;
    Ext: string;
    GraphicClass: TGraphicClass;
  end;

  TcxImageFileFormatList = array of TcxImageFileFormat;

  TcxImageFileFormats = class
  private
    FList: TcxImageFileFormatList;

    function Count: Integer;
    function GetItem(Index: Integer): TcxImageFileFormat;

    property Items[Index: Integer]: TcxImageFileFormat read GetItem;
  public
    procedure Register(const AName, AExt: string; AGraphicClass: TGraphicClass);
//TODO:    procedure UnRegister(AGraphicClass: TGraphicClass);
    function GetGraphicClass(const AFileName: string): TGraphicClass;
    function GetFilter: string;
  end;

  TcxImageListEditorAddMode = (amAdd, amInsert, amReplace);

  TcxImageListEditor = class
  private
    FChanged: Boolean;
    FImageListModified: Boolean;

    FDataControl: TListView;
    FImageList: TcxImageList;
    FOriginalImageList: TcxImageList;

    FImportList: TStrings;
    FVisibleImportList: TStrings;

    FEditorForm: TForm;
    FSplitBitmaps: TModalResult;
    FUpdateCount: Integer;

    FOnChange: TNotifyEvent;

    procedure AddDataItems(AImageList: TcxImagelist);
    procedure AddImage(AImage, AMask: TBitmap; AMaskColor: TColor; var AInsertedImageIndex: Integer);
    procedure Change;
    procedure ClearSelection;
    procedure DeleteDataItem(Sender: TObject; Item: TListItem);
    procedure DeleteImage(AIndex: Integer);
    function GetImagesCount: Integer;
    function GetDataItems: TListItems;
    function GetDefaultTransparentColor(AImage, AMask: TBitmap): TColor;
    function GetFocusedImageIndex: Integer;
    function GetImageHeight: Integer;
    function GetImagesInfo(Index: Integer): TcxEditorImageInfo;
    function GetImageWidth: Integer;
    procedure ImageListChanged;
    procedure SelectDataItem(Sender: TObject; Item: TListItem; Selected: Boolean);
    procedure SetFocusedImageIndex(AValue: Integer);
    procedure SetImageList(AValue: TcxImageList);
    procedure SetImagesInfo(Index: Integer; AValue: TcxEditorImageInfo);
    procedure SetImportList(AValue: TStrings);

    procedure UpdateImageList;
    procedure UpdateVisibleImportList;
  public
    constructor Create;
    destructor Destroy; override;

    function Edit(AImageList: TcxImagelist): Boolean;

    procedure AddImages(AFiles: TStrings; AAddMode: TcxImageListEditorAddMode);
    procedure ClearImages;
    procedure DeleteSelectedImages;
    procedure ExportImages(const AFileName: string);
    function InternalAddImage(AImage, AMask: TBitmap; AFileName: string;
      var AInsertedItemIndex: Integer; AMultiSelect: Boolean): Integer;
    procedure ImportImages(AImageList: TCustomImageList);
    procedure MoveImage(ASourceImageIndex, ADestImageIndex: Integer);

    function IsAnyImageSelected: Boolean;

    procedure BeginUpdate;
    procedure EndUpdate;
    function IsUpdateLocked: Boolean;

    procedure ApplyChanges;
    function IsChanged: Boolean;
    procedure UpdateTransparentColor(AColor: TColor);
    function ChangeImagesSize(AValue: TSize): Boolean;
    procedure SynchronizeData(AStartIndex, ACount: Integer);

    property DataControl: TListView read FDataControl;
    property DataItems: TListItems read GetDataItems;
    property FocusedImageIndex: Integer read GetFocusedImageIndex write SetFocusedImageIndex;
    property ImageHeight: Integer read GetImageHeight;
    property ImageList: TcxImageList read FImageList write SetImageList;
    property ImageListModified: Boolean read FImageListModified;
    property ImagesCount: Integer read GetImagesCount;
    property ImagesInfo[Index: Integer]: TcxEditorImageInfo read GetImagesInfo write SetImagesInfo;
    property ImageWidth: Integer read GetImageWidth;
    property ImportList: TStrings read FImportList write SetImportList;
    property OriginalImageList: TcxImageList read FOriginalImageList;
    property OnChange: TNotifyEvent read FOnChange write FOnChange;
  end;

function cxImageFileFormats: TcxImageFileFormats;
function cxEditImageList(AImageList: TcxImageList; AImportList: TStrings): Boolean;
procedure PngImageListTocxImageList(APngImages: TComponent; AImages: TcxImageList);

implementation

uses
  Types, Math, cxImageListEditorView;

var
  FImageFileFormats: TcxImageFileFormats;

type
  TcxImageListAccess = class(TcxImageList);

  TcxIcon = class(TIcon)
  public
    procedure GetImageInfo(AImageInfo: TcxImageInfo);
    procedure HandleNeeded;
  end;

procedure TcxIcon.GetImageInfo(AImageInfo: TcxImageInfo);
var
  AImages: TcxImageListAccess;
begin
  HandleNeeded;
  AImages := TcxImageListAccess.CreateSize(Width, Height);
  try
    AImages.AddIcon(Self);
    AImages.GetImageInfo(0, AImageInfo);
  finally
    AImages.Free;
  end;
end;

procedure TcxIcon.HandleNeeded;
begin
  Handle;
end;

function cxImageFileFormats: TcxImageFileFormats;
begin
  Result := FImageFileFormats;
end;

function cxEditImageList(AImageList: TcxImageList; AImportList: TStrings): Boolean;
var
  AImageListEditor: TcxImageListEditor;
begin
  Result := False;
  if AImageList = nil then
    Exit;
  AImageListEditor := TcxImageListEditor.Create;
  try
    AImageListEditor.ImportList := AImportList;
    Result := AImageListEditor.Edit(AImageList);
  finally
    AImageListEditor.Free;
  end;
end;

function IsIndexValid(AIndex, ACount: Integer): Boolean;
begin
  Result := (AIndex >= 0) and (AIndex < ACount);
end;

function IsBitmapAlphaUsed(AImage: TBitmap): Boolean;
var
  ATempBitmap: TcxBitmap;
begin
  ATempBitmap := TcxBitmap.Create;
  ATempBitmap.Assign(AImage);
  try
    Result := ATempBitmap.IsAlphaUsed;
  finally
    ATempBitmap.Free;
  end;
end;

procedure AddImageFromBinaryData(WriteData: TStreamProc; AImages: TcxImageList);
var
  AStream: TMemoryStream;
  ACount: Longint;
  B: TBitmap;
begin
  AStream := TMemoryStream.Create;
  try
    WriteData(AStream);
    ACount := AStream.Size;
    if ACount > 0 then
    begin
      AStream.Write(AStream.Memory^, ACount);
      AStream.Position := 0;
      with TdxPNGImage.Create do
      try
        LoadFromStream(AStream);
        B := GetAsBitmap;
        try
          AImages.Add(B, nil);
        finally
          B.Free;
        end;
      finally
        Free;
      end;
    end;
  finally
    AStream.Free;
  end;
end;

procedure ProcessPngImageList(AInputSteram: TMemoryStream; AImages: TcxImageList);
var
  ASaveSeparator: Char;
  AParser: TParser;

  function ConvertOrderModifier: Integer;
  begin
    Result := -1;
    if AParser.Token = '[' then
    begin
      AParser.NextToken;
      AParser.CheckToken(toInteger);
      Result := AParser.TokenInt;
      AParser.NextToken;
      AParser.CheckToken(']');
      AParser.NextToken;
    end;
  end;

  procedure ConvertHeader(AIsInherited, AIsInline: Boolean);
  var
    AClassName, AObjectName: string;
  begin
    AParser.CheckToken(toSymbol);
    AClassName := AParser.TokenString;
    AObjectName := '';
    if AParser.NextToken = ':' then
    begin
      AParser.NextToken;
      AParser.CheckToken(toSymbol);
      AObjectName := AClassName;
      AClassName := AParser.TokenString;
      AParser.NextToken;
    end;
    ConvertOrderModifier;
  end;

  procedure ConvertProperty; forward;

  procedure ConvertValue(const APropName: string);

    procedure SkipString;
    begin
      while AParser.NextToken = '+' do
      begin
        AParser.NextToken;
        if not (AParser.Token in [toString, toWString]) then
          AParser.CheckToken(toString);
      end;
    end;

    procedure SkipBinaryData;
    var
      S: TMemoryStream;
    begin
      S := TMemoryStream.Create;
      try
        AParser.HexToBinary(S);
      finally
        S.Free;
      end;
    end;

  begin
    if AParser.Token in [toString, toWString] then
      SkipString
    else
    begin
      case AParser.Token of
        toSymbol, toInteger, toFloat:;
        '[':
          begin
            AParser.NextToken;
            if AParser.Token <> ']' then
              while True do
              begin
                if AParser.NextToken = ']' then Break;
                AParser.CheckToken(',');
                AParser.NextToken;
              end;
          end;
        '(':
          begin
            AParser.NextToken;
            while AParser.Token <> ')' do
              ConvertValue('');
          end;
        '{':
          begin
            if APropName = 'PngImage.Data' then
              AddImageFromBinaryData(AParser.HexToBinary, AImages)
            else
              SkipBinaryData;
          end;
        '<':
          begin
            AParser.NextToken;
            while AParser.Token <> '>' do
            begin
              AParser.CheckTokenSymbol('item');

⌨️ 快捷键说明

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