doublecmd/uColorExt.pas
2008-02-01 07:09:16 +00:00

236 lines
6 KiB
ObjectPascal

{
Double Commander
-------------------------------------------------------------------------
Load colors of files in file panels
Copyright (C) 2003-2004 Radek Cervinka (radek.cervinka@centrum.cz)
Copyright (C) 2006-2007 Koblov Alexander (Alexx2000@mail.ru)
Copyright (C) 2008 Dmitry Kolomiets (B4rr4cuda@rambler.ru)
This program 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 program 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.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
}
unit uColorExt;
interface
uses
Classes, Graphics;
type
TMaskItem=class
sExt:string;
sModeStr:string;
cColor:TColor;
sName:string;
end;
{ TColorExt }
TColorExt=Class
private
protected
lslist:TList;
public
constructor Create;
destructor Destroy; override;
function ColorByExt(const sExt:String):TColor;
function GetColorByExt(const sExt:String):TColor;
function GetColorByAttr(const sModeStr:String):TColor;
function GetColorBy(const sExt,sModeStr: String): TColor;
procedure Load;
procedure Save;
end;
implementation
uses
SysUtils, uGlobs, Masks;
constructor TColorExt.Create;
begin
inherited;
lslist:=TList.Create;
end;
destructor TColorExt.Destroy;
begin
if assigned(lsList) then
begin
while lslist.Count>0 do
begin
TMaskItem(lslist[0]).Free;
lslist.Delete(0);
end;
FreeAndNil(lsList);
end;
end;
function TColorExt.ColorByExt(const sExt:String):TColor;
begin
Result:=GetColorByExt(sExt);
end;
function TColorExt.GetColorByExt(const sExt: String): TColor;
var I:integer;
begin
Result:= gForeColor; //$0000ff00;
for I:=0 to lslist.Count-1 do
begin
if MatchesMaskList(sExt,TMAskItem(lslist[I]).sExt,';') then
begin
Result:=TMAskItem(lslist[I]).cColor;
exit;
end;
end;
end;
function TColorExt.GetColorByAttr(const sModeStr: String): TColor;
var I:Integer;
begin
Result:= gForeColor; //$0000ff00;
for I:=0 to lslist.Count-1 do
begin
if MatchesMaskList(sModeStr,TMAskItem(lslist[I]).sModeStr,';') then
begin
Result:=TMAskItem(lslist[I]).cColor;
exit;
end;
end;
end;
function TColorExt.GetColorBy(const sExt, sModeStr: String): TColor;
var I:Integer;
begin
Result:= gForeColor; //$0000ff00;
for I:=0 to lslist.Count-1 do
begin
if ( MatchesMaskList(sExt,TMAskItem(lslist[I]).sExt,';') ) and
(MatchesMaskList(sModeStr,TMAskItem(lslist[I]).sModeStr,';') or (TMAskItem(lslist[I]).sModeStr='')) then
begin
Result:=TMAskItem(lslist[I]).cColor;
exit;
end;
end;
end;
(* Load colors of files from doublecmd.ini *)
{ format of colors storage as in Total Commander:
doublecmd.ini
[Colors]
ColorFilter1=*.o;*.ppu;*.rst;*.bak;*.dcu
ColorFilter1Color=16711680
ColorFilter2=*.pas
ColorFilter2Color=16711000
etc...
Added Attributes:
ColorFilter1Attributes=-r*xr*xr*x //all read/executable file
ColorFilter2Attributes=-*x* //all executable
ColorFilter3Attributes=d* //all directories
ColorFilter4Attributes=l* //all links
Be careful with * expression. Functions return just first found value.
This is right demo of [Colors] section:
ColorFilter3=*
ColorFilter3Color=55758
ColorFilter3Attributes=-rwxrwxr*x
ColorFilter3Name=SomeName3
ColorFilter4=*
ColorFilter4Color=32768
ColorFilter4Attributes=-*x*
ColorFilter4Name=SomeName4
This IS WRONG because ColorFilter3Attributes=-*x* will be
found and ColorFilter3Color=32768 will be returned first:
ColorFilter3=*
ColorFilter3Color=32768
ColorFilter3Attributes=-*x*
ColorFilter3Name=SomeName3
ColorFilter4=*
ColorFilter4Color=55758
ColorFilter4Attributes=-rwxrwxr*x
ColorFilter4Name=SomeName4
!!! The "?" and other regular expressions DOES NOT SUPPORTED
}
procedure TColorExt.Load;
var
sExtMask,
sAttr,
sName: String;
iColor,
I : Integer;
begin
I := 1;
if assigned(lsList) then
begin
while lslist.Count>0 do
begin
TMaskItem(lslist[0]).Free;
lslist.Delete(0);
end;
end;
while gIni.ReadString('Colors', 'ColorFilter' + IntToStr(I), '') <> '' do
begin
sExtMask := gIni.ReadString('Colors', 'ColorFilter' + IntToStr(I), '');
iColor := gIni.ReadInteger('Colors', 'ColorFilter' + IntToStr(I) + 'Color', clText);
sName:=gIni.ReadString('Colors', 'ColorFilter' + IntToStr(I)+'Name', '');
sAttr := gIni.ReadString('Colors', 'ColorFilter' + IntToStr(I) + 'Attributes', '');
lsList.Add(TMaskItem.Create);
TMaskItem(lsList[lsList.Count-1]).sName:=sName;
TMaskItem(lsList[lsList.Count-1]).cColor:=iColor;
TMaskItem(lsList[lsList.Count-1]).sExt:=sExtMask;
TMaskItem(lsList[lsList.Count-1]).sModeStr:=sAttr;
Inc(I);
end; // while gIni.ReadString();
end;
procedure TColorExt.Save;
var I:Integer;
begin
//if (lslist.Count=0) then
// TODO: list is empty. need to remove all "ColorFilter*" keys
if (lslist.Count=0) then exit;
if (not assigned(lslist)) then exit;
for I:=0 to lslist.Count - 1 do
begin
gIni.WriteString('Colors', 'ColorFilter' + IntToStr(I), TMaskItem(lsList[I]).sExt);
gIni.WriteInteger('Colors', 'ColorFilter' + IntToStr(I) + 'Color', TMaskItem(lsList[I]).cColor);
gIni.WriteString('Colors', 'ColorFilter' + IntToStr(I)+'Name', TMaskItem(lsList[I]).sName);
gIni.WriteString('Colors', 'ColorFilter' + IntToStr(I) + 'Attributes', TMaskItem(lsList[I]).sModeStr);
end;
end;
end.