doublecmd/src/usearchcontent.pas
2015-08-02 11:26:13 +00:00

276 lines
7.5 KiB
ObjectPascal

{
Double Commander
-------------------------------------------------------------------------
Content plugin search control
Copyright (C) 2014 Alexander Koblov (alexx2000@mail.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 uSearchContent;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Controls, StdCtrls, ExtCtrls, uFindFiles;
type
{ TPluginPanel }
TPluginPanel = class(TPanel)
private
FPlugin,
FField,
FOperator,
FValue: TComboBox;
private
function GetCompare: TPluginOperator;
function GetField: String;
function GetFieldType: Integer;
function GetPlugin: String;
function GetValue: Variant;
procedure PluginChange(Sender: TObject);
procedure FieldChange(Sender: TObject);
procedure SetCompare(AValue: TPluginOperator);
procedure SetField(AValue: String);
procedure SetPlugin(AValue: String);
procedure SetValue(AValue: Variant);
procedure SetComboBox(ComboBox: TComboBox; const Value, Error: UTF8String);
public
constructor Create(TheOwner: TComponent); override;
destructor Destroy; override;
public
property Plugin: String read GetPlugin write SetPlugin;
property Field: String read GetField write SetField;
property FieldType: Integer read GetFieldType;
property Compare: TPluginOperator read GetCompare write SetCompare;
property Value: Variant read GetValue write SetValue;
end;
implementation
uses
Variants, StrUtils, WdxPlugin, uGlobs, uWDXModule, Graphics, uShowMsg;
{ TPluginPanel }
function TPluginPanel.GetCompare: TPluginOperator;
begin
Result:= TPluginOperator(PtrInt(FOperator.Items.Objects[FOperator.ItemIndex]));
end;
function TPluginPanel.GetField: String;
begin
Result:= FField.Text;
end;
function TPluginPanel.GetFieldType: Integer;
begin
Result:= PtrInt(FField.Items.Objects[FField.ItemIndex]);
end;
function TPluginPanel.GetPlugin: String;
begin
Result:= FPlugin.Text;
end;
function TPluginPanel.GetValue: Variant;
begin
Result:= StrToVar(FValue.Text, PtrInt(FField.Items.Objects[FField.ItemIndex]));
end;
procedure TPluginPanel.PluginChange(Sender: TObject);
var
I: Integer;
Module: TWDXModule;
begin
if FPlugin.ItemIndex < 0 then Exit;
FField.Items.Clear;
Module:= gWdxPlugins.GetWdxModule(FPlugin.Text);
if Assigned(Module) then
for I:= 0 to Module.FieldList.Count - 1 do
begin
FField.Items.AddObject(Module.FieldList[I], TObject(PtrInt(TWdxField(Module.FieldList.Objects[I]).FType)));
end;
if FField.Items.Count > 0 then
begin
FField.ItemIndex:= 0;
FieldChange(FField);
end;
end;
procedure TPluginPanel.FieldChange(Sender: TObject);
var
I, J: Integer;
sUnits: String;
Module: TWDXModule;
begin
FValue.Items.Clear;
FOperator.Items.Clear;
Module:= gWdxPlugins.GetWdxModule(FPlugin.Text);
J:= Module.GetFieldIndex(FField.Text);
if J < 0 then Exit;
I:= TWdxField(Module.FieldList.Objects[J]).FType;
case I of
FT_NUMERIC_32,
FT_NUMERIC_64,
FT_NUMERIC_FLOATING,
FT_DATE,
FT_TIME,
FT_DATETIME:
begin
FValue.Style:= csDropDown;
FOperator.Items.AddObject('=', TObject(PtrInt(poEqual)));
FOperator.Items.AddObject('!=', TObject(PtrInt(poNotEqual)));
FOperator.Items.AddObject('>', TObject(PtrInt(poMore)));
FOperator.Items.AddObject('<', TObject(PtrInt(poLess)));
FOperator.Items.AddObject('>=', TObject(PtrInt(poMoreEqual)));
FOperator.Items.AddObject('<=', TObject(PtrInt(poLessEqual)));
end;
FT_BOOLEAN:
begin
FValue.Items.Add('True');
FValue.Items.Add('False');
FValue.ItemIndex:= 0;
FValue.Style:= csDropDownList;
FOperator.Items.AddObject('=', TObject(PtrInt(poEqual)));
end;
FT_MULTIPLECHOICE:
begin
begin
FValue.Style:= csDropDownList;
FOperator.Items.AddObject('=', TObject(PtrInt(poEqual)));
FOperator.Items.AddObject('!=', TObject(PtrInt(poNotEqual)));
sUnits:= TWdxField(Module.FieldList.Objects[J]).FUnits;
while sUnits <> EmptyStr do
begin
FValue.Items.Add(Copy2SymbDel(sUnits, '|'));
end;
if FValue.Items.Count > 0 then FValue.ItemIndex:= 0;
end;
end;
FT_STRING,
FT_STRINGW,
FT_FULLTEXT:
begin
FValue.Style:= csDropDown;
FOperator.Items.AddObject('=', TObject(PtrInt(poEqual)));
FOperator.Items.AddObject('!=', TObject(PtrInt(poNotEqual)));
FOperator.Items.AddObject('=(case)', TObject(PtrInt(poEqualCase)));
FOperator.Items.AddObject('!=(case)', TObject(PtrInt(poNotEqualCase)));
FOperator.Items.AddObject('contains', TObject(PtrInt(poContains)));
FOperator.Items.AddObject('!contains', TObject(PtrInt(poNotContains)));
FOperator.Items.AddObject('contains(case)', TObject(PtrInt(poContainsCase)));
FOperator.Items.AddObject('!contains(case)', TObject(PtrInt(poNotContainsCase)));
end;
end;
if FOperator.Items.Count > 0 then FOperator.ItemIndex:= 0;
end;
procedure TPluginPanel.SetCompare(AValue: TPluginOperator);
var
Index: Integer;
begin
Index:= FOperator.Items.IndexOfObject(TObject(PtrInt(AValue)));
if Index >= 0 then FOperator.ItemIndex:= Index;
end;
procedure TPluginPanel.SetField(AValue: String);
begin
SetComboBox(FField, AValue, Format('Field %s not found!', [AValue]));
end;
procedure TPluginPanel.SetPlugin(AValue: String);
begin
SetComboBox(FPlugin, AValue, Format('Plugin %s not found!', [AValue]));
end;
procedure TPluginPanel.SetValue(AValue: Variant);
begin
FValue.Text:= VarToStr(AValue)
end;
procedure TPluginPanel.SetComboBox(ComboBox: TComboBox; const Value,
Error: UTF8String);
var
Index: Integer;
begin
Index:= ComboBox.Items.IndexOf(Value);
if Index < 0 then
msgError(Error)
else begin
ComboBox.ItemIndex:= Index;
if Assigned(ComboBox.OnChange) then ComboBox.OnChange(ComboBox);
end;
end;
constructor TPluginPanel.Create(TheOwner: TComponent);
var
I: Integer;
begin
inherited Create(TheOwner);
AutoSize:= True;
BevelOuter:= bvNone;
ChildSizing.ControlsPerLine:= 4;
ChildSizing.Layout:= cclLeftToRightThenTopToBottom;
ChildSizing.EnlargeHorizontal:= crsScaleChilds;
FPlugin:= TComboBox.Create(Self);
FPlugin.Parent:= Self;
FPlugin.Style:= csDropDownList;
FPlugin.OnChange:= @PluginChange;
FField:= TComboBox.Create(Self);
FField.Parent:= Self;
FField.Style:= csDropDownList;
FField.OnChange:= @FieldChange;
FOperator:= TComboBox.Create(Self);
FOperator.Parent:= Self;
FOperator.Style:= csDropDownList;
FValue:= TComboBox.Create(Self);
FValue.Parent:= Self;
for I:= 0 to gWDXPlugins.Count - 1do
begin
if gWdxPlugins.GetWdxModule(I).IsLoaded or gWdxPlugins.GetWdxModule(I).LoadModule then
begin
FPlugin.Items.Add(gWdxPlugins.GetWdxModule(I).Name);
end;
end;
if FPlugin.Items.Count > 0 then
begin
FPlugin.ItemIndex:= 0;
PluginChange(FPlugin);
end;
end;
destructor TPluginPanel.Destroy;
begin
FPlugin.Free;
FField.Free;
FOperator.Free;
FValue.Free;
inherited Destroy;
end;
end.