// GLSLExpert {: Egg
GLSLExpert expert registration and bindings
Historique :
}
unit GLSLExpert;
interface
uses Windows, Classes, ToolsAPI, Menus, SysUtils;
type
// TGLSLWizard
//
TGLSLWizard = class(TNotifierObject, IOTAMenuWizard, IOTAWizard)
public
// IOTAWizard
function GetIDString : String;
function GetName : String;
function GetState : TWizardState;
procedure Execute;
// IOTAMenuWizard
function GetMenuText : String;
end;
// TGLSLKeyBinding
//
TGLSLKeyBinding = class (TNotifierObject, IOTAKeyboardBinding)
procedure KeyProcValidate(const Context: IOTAKeyContext; KeyCode: TShortcut; var BindingResult: TKeyBindingResult);
procedure BindKeyboard(const BindingServices: IOTAKeyBindingServices);
function GetBindingType : TBindingType;
function GetDisplayName : String;
function GetName : String;
end;
procedure Register;
// ------------------------------------------------------------------
// ------------------------------------------------------------------
// ------------------------------------------------------------------
implementation
// ------------------------------------------------------------------
// ------------------------------------------------------------------
// ------------------------------------------------------------------
uses Dialogs;
var
vKeyBindingIndex : Integer;
vValidateShortCut : TShortCut = 24662; // Ctrl+Shift+V
procedure Register;
begin
RegisterPackageWizard(TGLSLWizard.Create);
vKeyBindingIndex:=(BorlandIDEServices as IOTAKeyboardServices).AddKeyboardBinding(TGLSLKeyBinding.Create);
end;
procedure TGLSLWizard.Execute;
begin
ShowMessage( 'GLSL Expert'#13#10#13#10
+'Copyright 2005 - Eric Grange / GLScene.org');
end;
function TGLSLWizard.GetIDString: string;
begin
Result := 'GLScene.GLSLExpert';
end;
function TGLSLWizard.GetMenuText: string;
begin
Result := 'GLSL Expert';
end;
function TGLSLWizard.GetName : string;
begin
Result := 'GLSLExpert';
end;
function TGLSLWizard.GetState : TWizardState;
begin
Result:=[wsEnabled];
end;
procedure TGLSLKeyBinding.BindKeyboard(const BindingServices : IOTAKeyBindingServices);
begin
BindingServices.AddKeyBinding([vValidateShortCut], KeyProcValidate, nil);
end;
function TGLSLKeyBinding.GetBindingType : TBindingType;
begin
Result:=btPartial;
end;
function TGLSLKeyBinding.GetDisplayName : String;
begin
Result:='GLSLExpert KeyBinding';
end;
function TGLSLKeyBinding.GetName : String;
begin
Result:=GetDisplayName;
end;
// KeyProcValidate
//
procedure TGLSLKeyBinding.KeyProcValidate(const Context: IOTAKeyContext; KeyCode: TShortcut;
var BindingResult: TKeyBindingResult);
var
editorServices : IOTAEditorServices;
msgServices : IOTAMessageServices;
msgGroup : IOTAMessageGroup;
editBuffer : IOTAEditBuffer;
editPosition : IOTAEditPosition;
i, p, colNb, lineNb : Integer;
currentDirBackup : String;
fileName, cmdLine, logFileName : String;
errPrefix, errLine : String;
lineRef : Pointer;
log : TStringList;
begin
BindingResult:=krHandled;
editorServices:=(BorlandIDEServices as IOTAEditorServices);
msgServices:=(BorlandIDEServices as IOTAMessageServices);
editBuffer:=editorServices.TopBuffer;
if Assigned(editBuffer) and (not editBuffer.IsReadOnly) then begin
editPosition:=editBuffer.EditPosition;
fileName:=editBuffer.FileName;
cmdLine:='"C:\Program Files\3Dlabs\GLSL Validate\glslvalidate.exe" ';
if CompareText(ExtractFileExt(fileName), '.glsl')<>0 then
Exit // not a GLSL file
else if Pos('_fp.glsl', LowerCase(fileName))>0 then begin
cmdLine:=cmdLine+'/f ';
logFileName:='fragment.log';
end else if Pos('_vp.glsl', LowerCase(fileName))>0 then begin
cmdLine:=cmdLine+'/v ';
logFileName:='vertex.log';
end else begin
ShowMessage( 'Couldn''t determine if this was a vertex or fragment program.'#13#10
+'Please terminate your filename with "_fp.glsl" or "_vp.glsl",'#13#10
+'or contribute better detection logic code ;)');
Exit;
end;
if editBuffer.IsModified then
(BorlandIDEServices as IOTAActionServices).SaveFile(fileName);
cmdLine:=cmdLine+'"'+fileName+'"';
currentDirBackup:=GetCurrentDir;
SetCurrentDir(ExtractFilePath(fileName));
WinExec(PAnsiChar(AnsiString(cmdLine)), SW_HIDE);
SetCurrentDir(currentDirBackup);
logFileName:=ExtractFilePath(fileName)+logFileName;
if FileExists(logFileName) then begin
log:=TStringList.Create;
try
msgGroup:=msgServices.GetGroup('GLSL');
if msgGroup=nil then
msgGroup:=msgServices.AddMessageGroup('GLSL')
else msgServices.ClearToolMessages(msgGroup);
log.LoadFromFile(logFileName);
if log.Count=0 then
msgServices.AddToolMessage(fileName, 'Validation failed for some undetermined reason...',
'GLSL', 0, 0, nil, lineRef, msgGroup)
else if CompareText(log[0], 'Success.')=0 then
msgServices.AddToolMessage(fileName, 'Validation passed successfully!',
'GLSL', 0, 0, nil, lineRef, msgGroup)
else begin
// we got error dude
for i:=1 to log.Count-1 do begin
p:=Pos(':', log[i]);
if p>0 then begin
errPrefix:=Copy(log[i], 1, p-1);
errLine:=Copy(log[i], p+1, MaxInt);
p:=Pos(':', errLine);
colNb:=StrToIntDef(Copy(errLine, 1, p-1), 0);
errLine:=Copy(errLine, p+1, MaxInt);
p:=Pos(':', errLine);
lineNb:=StrToIntDef(Copy(errLine, 1, p-1), 0);
errLine:=Copy(errLine, p+1, MaxInt);
msgServices.AddToolMessage(fileName, errLine, errPrefix, lineNb, colNb,
nil, lineRef, msgGroup);
end;
end;
end;
msgServices.ShowMessageView(msgGroup);
finally
log.Free;
end;
DeleteFile(logFileName);
end else ShowMessage('Couldn''t find validation log file!');
end;
end;
end.