lazarus/ideintf/ideoptionsintf.pas
mattias 65c80f814d codetools: added indenter to sourcechanger
git-svn-id: trunk@20318 -
2009-05-30 17:58:32 +00:00

356 lines
10 KiB
ObjectPascal

{
***************************************************************************
* *
* This source is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This code is distributed in the hope that it will be useful, but *
* WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
* General Public License for more details. *
* *
* A copy of the GNU General Public License is available on the World *
* Wide Web at <http://www.gnu.org/copyleft/gpl.html>. You can also *
* obtain it by writing to the Free Software Foundation, *
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
***************************************************************************
}
unit IDEOptionsIntf;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms;
const
NoParent = -1;
type
// forward
TAbstractOptionsEditorDialog = class;
// types
TAbstractIDEOptions = class(TPersistent)
end;
TAbstractIDEOptionsClass = class of TAbstractIDEOptions;
TOnLoadIDEOptions = procedure(Sender: TObject; AOptions: TAbstractIDEOptions) of object;
TOnSaveIDEOptions = procedure(Sender: TObject; AOptions: TAbstractIDEOptions) of object;
{ TAbstractIDEOptionsEditor }
TAbstractIDEOptionsEditor = class(TFrame)
private
FOnLoadIDEOptions: TOnLoadIDEOptions;
FOnSaveIDEOptions: TOnSaveIDEOptions;
public
function Check: Boolean; virtual;
function GetTitle: String; virtual; abstract;
procedure Setup(ADialog: TAbstractOptionsEditorDialog); virtual; abstract;
procedure ReadSettings(AOptions: TAbstractIDEOptions); virtual; abstract;
procedure WriteSettings(AOptions: TAbstractIDEOptions); virtual; abstract;
class function SupportedOptionsClass: TAbstractIDEOptionsClass; virtual; abstract;
property OnLoadIDEOptions: TOnLoadIDEOptions read FOnLoadIDEOptions write FOnLoadIDEOptions;
property OnSaveIDEOptions: TOnSaveIDEOptions read FOnSaveIDEOptions write FOnSaveIDEOptions;
end;
TAbstractIDEOptionsEditorClass = class of TAbstractIDEOptionsEditor;
TIDEOptionsEditorRec = record
Index: Integer;
Parent: Integer;
EditorClass: TAbstractIDEOptionsEditorClass;
end;
PIDEOptionsEditorRec = ^TIDEOptionsEditorRec;
{ TIDEOptionsEditorList }
TIDEOptionsEditorList = class(TList)
private
function GetItem(AIndex: Integer): PIDEOptionsEditorRec;
procedure SetItem(AIndex: Integer; const AValue: PIDEOptionsEditorRec);
protected
procedure Notify(Ptr: Pointer; Action: TListNotification); override;
function GetByIndex(AIndex: Integer): PIDEOptionsEditorRec;
public
procedure Resort;
procedure Add(AEditorClass: TAbstractIDEOptionsEditorClass; AIndex, AParent: Integer); reintroduce;
property Items[AIndex: Integer]: PIDEOptionsEditorRec read GetItem write SetItem; default;
end;
TIDEOptionsGroupRec = record
Index: Integer;
Caption: String;
Items: TIDEOptionsEditorList;
end;
PIDEOptionsGroupRec = ^TIDEOptionsGroupRec;
{ TIDEOptionsGroupList }
TIDEOptionsGroupList = class(TList)
private
function GetItem(AIndex: Integer): PIDEOptionsGroupRec;
procedure SetItem(AIndex: Integer; const AValue: PIDEOptionsGroupRec);
protected
procedure Notify(Ptr: Pointer; Action: TListNotification); override;
function GetByIndex(AIndex: Integer): PIDEOptionsGroupRec;
public
procedure Resort;
procedure Add(AGroupIndex: Integer; ACaption: String); reintroduce;
property Items[AIndex: Integer]: PIDEOptionsGroupRec read GetItem write SetItem; default;
end;
TAbstractOptionsEditorDialog = class(TForm)
public
function FindEditor(AEditor: TAbstractIDEOptionsEditorClass): TAbstractIDEOptionsEditor; virtual; abstract;
end;
procedure RegisterIDEOptionsGroup(AGroupIndex: Integer; ACaption: String);
procedure RegisterIDEOptionsEditor(AGroupIndex: Integer; AEditorClass: TAbstractIDEOptionsEditorClass; AIndex: Integer; AParent: Integer = NoParent);
function IDEEditorGroups: TIDEOptionsGroupList;
const
// options groups
GroupEnvironment = 100;
EnvOptionsFiles = 100;
EnvOptionsDesktop = 200;
EnvOptionsWindow = 300;
EnvOptionsFormEd = 400;
EnvOptionsOI = 500;
EnvOptionsBackup = 600;
EnvOptionsNaming = 700;
EnvOptionsFpDoc = 800;
GroupEditor = 200;
EdtOptionsGeneral = 100;
EdtOptionsGeneralMisc = 101;
EdtOptionsDisplay = 200;
EdtOptionsKeys = 300;
EdtOptionsColors = 400;
EdtOptionsCodetools = 500;
EdtOptionsCodeFolding = 600;
EdtOptionsCodeFoldingMouse = 601;
EdtOptionsDrawDivider = 700;
GroupCodetools = 300;
CdtOptionsGeneral = 100;
CdtOptionsClassCompletion = 200;
CdtOptionsCodeCreation = 300;
CdtOptionsWords = 400;
CdtOptionsLineSplitting = 500;
CdtOptionsSpace = 600;
CdtOptionsIdentCompletion = 700;
GroupCodeExplorer = 350;
cdeOptionsUpdate = 100;
cdeOptionsCategories = 200;
cdeOptionsFigures = 300;
GroupDebugger = 400;
DbgOptionsGeneral = 100;
DbgOptionsEventLog = 200;
DbgOptionsLanguageExceptions = 300;
DbgOptionsSignals = 400;
GroupHelp = 500;
HlpOptionsGeneral = 100;
implementation
var
FIDEEditorGroups: TIDEOptionsGroupList;
function IDEEditorGroups: TIDEOptionsGroupList;
begin
if FIDEEditorGroups = nil then
FIDEEditorGroups := TIDEOptionsGroupList.Create;
Result := FIDEEditorGroups;
end;
procedure RegisterIDEOptionsGroup(AGroupIndex: Integer; ACaption: String);
begin
IDEEditorGroups.Add(AGroupIndex, ACaption);
end;
procedure RegisterIDEOptionsEditor(AGroupIndex: Integer; AEditorClass: TAbstractIDEOptionsEditorClass; AIndex: Integer; AParent: Integer = NoParent);
var
Rec: PIDEOptionsGroupRec;
begin
Rec := IDEEditorGroups.GetByIndex(AGroupIndex);
if Rec = nil then
begin
RegisterIDEOptionsGroup(AGroupIndex, IntToStr(AGroupIndex));
Rec := IDEEditorGroups.GetByIndex(AGroupIndex);
end;
if Rec <> nil then
begin
if Rec^.Items = nil then
Rec^.Items := TIDEOptionsEditorList.Create;
Rec^.Items.Add(AEditorClass, AIndex, AParent);
end;
end;
function GroupListCompare(Item1, Item2: Pointer): Integer;
var
Rec1: PIDEOptionsGroupRec absolute Item1;
Rec2: PIDEOptionsGroupRec absolute Item2;
begin
if Rec1^.Index < Rec2^.Index then
Result := -1
else
if Rec1^.Index > Rec2^.Index then
Result := 1
else
Result := 0;
end;
function OptionsListCompare(Item1, Item2: Pointer): Integer;
var
Rec1: PIDEOptionsEditorRec absolute Item1;
Rec2: PIDEOptionsEditorRec absolute Item2;
begin
if Rec1^.Index < Rec2^.Index then
Result := -1
else
if Rec1^.Index > Rec2^.Index then
Result := 1
else
Result := 0;
end;
{ TAbstractIDEOptionsEditor }
function TAbstractIDEOptionsEditor.Check: Boolean;
begin
Result := True;
end;
{ TIDEOptionsEditorList }
function TIDEOptionsEditorList.GetItem(AIndex: Integer): PIDEOptionsEditorRec;
begin
Result := PIDEOptionsEditorRec(inherited Get(AIndex));
end;
procedure TIDEOptionsEditorList.SetItem(AIndex: Integer; const AValue: PIDEOptionsEditorRec);
begin
inherited Put(AIndex, AValue);
end;
procedure TIDEOptionsEditorList.Notify(Ptr: Pointer; Action: TListNotification);
begin
if Action = lnDeleted then
Dispose(PIDEOptionsEditorRec(Ptr));
inherited Notify(Ptr, Action);
end;
function TIDEOptionsEditorList.GetByIndex(AIndex: Integer): PIDEOptionsEditorRec;
var
i: integer;
begin
Result := nil;
for i := 0 to Count - 1 do
if Items[i]^.Index = AIndex then
begin
Result := Items[i];
break;
end;
end;
procedure TIDEOptionsEditorList.Resort;
begin
Sort(@OptionsListCompare);
end;
procedure TIDEOptionsEditorList.Add(AEditorClass: TAbstractIDEOptionsEditorClass; AIndex, AParent: Integer);
var
Rec: PIDEOptionsEditorRec;
begin
Rec := GetByIndex(AIndex);
if Rec = nil then
begin
New(Rec);
Rec^.Index := AIndex;
Rec^.Parent := AParent;
inherited Add(Rec);
end;
Rec^.EditorClass := AEditorClass;
end;
{ TIDEOptionsGroupList }
function TIDEOptionsGroupList.GetItem(AIndex: Integer): PIDEOptionsGroupRec;
begin
Result := PIDEOptionsGroupRec(inherited Get(AIndex));
end;
procedure TIDEOptionsGroupList.SetItem(AIndex: Integer;
const AValue: PIDEOptionsGroupRec);
begin
inherited Put(AIndex, AValue);
end;
procedure TIDEOptionsGroupList.Notify(Ptr: Pointer; Action: TListNotification);
begin
if Action = lnDeleted then
begin
PIDEOptionsGroupRec(Ptr)^.Items.Free;
Dispose(PIDEOptionsGroupRec(Ptr));
end;
inherited Notify(Ptr, Action);
end;
function TIDEOptionsGroupList.GetByIndex(AIndex: Integer): PIDEOptionsGroupRec;
var
i: integer;
begin
Result := nil;
for i := 0 to Count - 1 do
if Items[i]^.Index = AIndex then
begin
Result := Items[i];
break;
end;
end;
procedure TIDEOptionsGroupList.Resort;
var
i: integer;
begin
Sort(@GroupListCompare);
for i := 0 to Count - 1 do
if Items[i]^.Items <> nil then
Items[i]^.Items.Resort;
end;
procedure TIDEOptionsGroupList.Add(AGroupIndex: Integer; ACaption: String);
var
Rec: PIDEOptionsGroupRec;
begin
Rec := GetByIndex(AGroupIndex);
if Rec = nil then
begin
New(Rec);
Rec^.Index := AGroupIndex;
Rec^.Items := nil;
inherited Add(Rec);
end;
Rec^.Caption := ACaption;
end;
initialization
FIDEEditorGroups := nil;
finalization
FreeAndNil(FIDEEditorGroups);
end.