123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523 |
- {$mode objfpc}
- {$h+}
- unit frmmain;
- interface
- uses gdk,gtk,fpgtk,fpgtkext,classes,sysutils;
- Type
- TMainForm = Class(TFPGtkWindow)
- FModified : Boolean;
- FFileName : String;
- FUnitName : String;
- FLanguageID : Integer;
- FSubLanguageID : Integer;
- FVerbose,
- FCreateMsg,
- FCreatePas,
- FCreateRC,
- FEscapePath : Boolean;
- FMsgLabel : TFPgtkLabel;
- FMsgList : TFPgtkScrollList;
- FMsgVBox,
- FVBox : TFPGtkVBox;
- FVPaned : TFPgtkVPaned;
- FFile,
- FFileNew,
- FFileOpen,
- FFileSave,
- FFileSaveAs,
- FFileExit,
- FEdit,
- FEditCut,
- FEditCopy,
- FEditPaste,
- FProject,
- FProjectCompile,
- FProjectOptions,
- FHelp,
- FHelpAbout : TFPGtkMenuItem;
- FMainMenu : TFPGtkMenuBar;
- FEditor : TFPGtkScrollText;
- Procedure CreateWindow;
- Function CheckSaved : Boolean;
- Procedure SetCaption;
- Function GetFileName(ATitle : String) : String;
- // Callback functions.
- Procedure DialogSetFilename(Sender : TFPGtkWindow;Data : Pointer; Action : Integer;Initiator : TFPGtkObject);
- Procedure SaveOptions(Sender : TFPGtkWindow;Data : Pointer; Action : Integer;Initiator : TFPGtkObject);
- Function OnDeleteEvent(Sender:TFPgtkWidget; Event:PGdkEvent; data:pointer): boolean;
- Procedure FileNewClick(Sender : TFPGtkObject; Data : Pointer);
- Procedure FileSaveClick(Sender : TFPgtkObject; Data : Pointer);
- Procedure FileSaveAsClick(Sender : TFPGtkObject; Data : Pointer);
- Procedure FileOpenClick(Sender : TFPGtkObject; Data : Pointer);
- Procedure FileExitClick(Sender : TFPgtkObject ; Data : Pointer);
- Procedure EditCCPClick(Sender : TFPGtkObject; Data : Pointer);
- Procedure ProjectCompileClick(Sender : TFPGtkObject; Data : Pointer);
- Procedure ProjectOptionsClick(Sender : TFPGtkObject; Data : Pointer);
- Procedure HelpAboutClick(Sender : TFPGtkObject; Data : Pointer);
- Procedure EditorChanged(Sender : TFPgtkObject; Data : Pointer);
- Procedure DoError(Sender : TObject; Msg : String);
- Procedure DoVerbose(Sender : TObject; Msg : String);
- Public
- Constructor Create;
- Procedure Compile;
- Procedure SetOptions;
- Procedure LoadFromFile(FN : String);
- Procedure SaveToFile(FN : String);
- Procedure NewFile;
- Procedure EditCut;
- Procedure EditCopy;
- Procedure EditPaste;
- Property Modified : Boolean Read FModified;
- Property FileName : String Read FFileName;
- end;
- Implementation
- uses frmabout,frmoptions,msgcomp;
- ResourceString
- SMenuFile = '_File';
- SMenuFileNew = '_New';
- SMenuFileOpen = '_Open';
- SMenuFileSave = '_Save';
- SMenuFileSaveAs = 'Save _as';
- SMenuFileExit = 'E_xit';
- SMenuEdit = '_Edit';
- SMenuEditCut = 'C_ut';
- SMenuEditCopy = '_Copy';
- SMenuEditPaste = '_Paste';
- SMenuProject = '_Project';
- SMenuProjectCompile = '_Compile';
- SMenuProjectoptions = '_Options';
- SMenuHelp = '_Help';
- SMenuHelpAbout = '_About';
- SCaption = 'Free Pascal message compiler';
- SFileModified = 'File has changed. Save changes ?';
- SSaveFile = 'Save file as';
- SOpenFile = 'Select file to open';
- SModified = '(modified)';
- SCompilerMessages = 'Compile messages';
- SErrsCompiling = 'Encountered %d errors while compiling.';
- SSuccesCompiling = 'Succesfully compiled messages.';
- SErrUnexpected = 'The following unexpected error occurred when compiling:%s';
- { ---------------------------------------------------------------------
- Form Creation
- ---------------------------------------------------------------------}
- Constructor TMainForm.Create;
- begin
- Inherited create (gtk_window_dialog);
- FCreateMsg:=True;
- FCreatePas:=True;
- FCreateRC:=True;
- FEscapePath:=True;
- FVerbose:=True;
- Createwindow;
- If ParamCount>0 then
- LoadFromFile(Paramstr(1));
- end;
- Procedure TMainForm.CreateWindow;
- Var
- FAccelGroup : Integer;
- begin
- FVBox:=TFPgtkVBox.Create;
- FAccelGroup:=AccelGroupNew;
- FFileNew:=NewMenuItem(SMenuFileNew,'','', MakeAccelKeyDef(Self,FaccelGroup,GDK_N,[amcontrol]),@FileNewClick,Nil);
- FFileOpen:=NewMenuItem(SMenuFileOpen,'','', MakeAccelKeyDef(Self,FaccelGroup,GDK_O,[amcontrol]),@FileOpenClick,Nil);
- FFileSave:=NewMenuItem(SMenuFileSave,'','', MakeAccelKeyDef(Self,FaccelGroup,GDK_S,[amcontrol]),@FileSaveClick,Nil);
- FFileSaveAs:=NewMenuItem(SMenuFileSaveAs,'','', @FileSaveAsClick,Nil);
- FFileExit:=NewMenuItem(SMenuFileExit,'','', MakeAccelKeyDef(Self,FaccelGroup,GDK_Q,[amcontrol]),@FileExitClick,Nil);
- FFile:=NewSubMenu(SmenuFile,'','',[FFileNew,FFileOpen,FFileSave,FFileSaveAs,NewLine,FFileExit]);
- FEditCut:=NewMenuItem(SMenuEditCut,'','', MakeAccelKeyDef(Self,FaccelGroup,GDK_X,[amcontrol]),@EditCCPClick,Nil);
- FEditCopy:=NewMenuItem(SMenuEditCopy,'','', MakeAccelKeyDef(Self,FaccelGroup,GDK_C,[amcontrol]),@EditCCPClick,Nil);
- FEditPaste:=NewMenuItem(SMenuEditPaste,'','', MakeAccelKeyDef(Self,FaccelGroup,GDK_V,[amcontrol]),@EditCCPClick,Nil);
- FEdit:=NewSubMenu(SMenuEdit,'','',[FEditCut,FEditCopy,FEditPaste]);
- FProjectCompile:=NewMenuItem(SMenuProjectCompile,'','', MakeAccelKeyDef(Self,FaccelGroup,GDK_F9,[amcontrol]),@ProjectCompileClick,Nil);
- FProjectOptions:=NewMenuItem(SMenuProjectOptions,'','', MakeAccelKeyDef(Self,FaccelGroup,GDK_F11,[amcontrol,amshift]),@ProjectOptionsClick,Nil);
- FProject := NewSubMenu(SMenuProject,'','',[FProjectCompile,FProjectoptions]);
- FHelpAbout:=NewMenuItem(SMenuHelpAbout ,'','',@HelpAboutClick,Nil);
- FHelp := NewSubMenu(SMenuHelp,'','',[FHelpAbout]);
- FMainMenu:=NewMenuBar([FFile,FEdit,FProject,FHelp]);
- FEditor:=TFPgtkScrollText.Create;
- Feditor.TheText.ConnectChanged(@EditorChanged,Nil);
- // Compiling messages
- FMsgLabel:=TFPgtkLabel.Create(SCompilerMessages);
- FMsgList:=TFPgtkScrollList.Create;
- FMsgVBox:=TFPgtkVbox.Create;
- FMsgVBox.PackStart(FMsgLabel,False,False,0);
- FMsgVBox.PackStart(FMsgList,True,True,0);
- FVPaned:=TFPgtkVPaned.Create;
- FVPaned.Add1(FEditor);
- FVPaned.Add2(FMsgVBox);
- FVPaned.Position:=350;
- FVBox.PackStart(FmainMenu,False,False,0);
- FVBox.PackStart(FVPaned,true, true, 0);
- ConnectDeleteEvent(@OnDeleteEvent,Nil);
- Add(FVBox);
- SetUSize(640,480);
- SetCaption;
- FEditor.TheText.GrabFocus;
- end;
- { ---------------------------------------------------------------------
- Callback events
- ---------------------------------------------------------------------}
- Procedure TMainForm.FileNewClick(Sender : TFPGtkObject; Data : Pointer);
- begin
- If CheckSaved then
- NewFile;
- end;
- Function TMainForm.OnDeleteEvent(Sender:TFPgtkWidget; Event:PGdkEvent; data:pointer): boolean;
- begin
- Result:=Not CheckSaved;
- end;
- Procedure TMainForm.FileSaveClick(Sender : TFPgtkObject; Data : Pointer);
- begin
- If (FFileName='') then
- FileSaveAsClick(Sender,Data)
- else
- SaveToFile(FFileName);
- end;
- Procedure TMainForm.FileSaveAsClick(Sender : TFPGtkObject; Data : Pointer);
- Var
- FN : String;
- begin
- FN:=GetFileName(SSaveFile);
- If (FN<>'') then
- SavetoFile(FN);
- end;
- Procedure TMainForm.FileOpenClick(Sender : TFPGtkObject; Data : Pointer);
- Var
- FN : String;
- begin
- FN:=GetFileName(SOpenFile);
- If (FN<>'') then
- LoadFromFile(FN);
- end;
- Procedure TMainForm.EditorChanged(Sender : TFPgtkObject; Data : Pointer);
- begin
- If FModified<>True then
- begin
- FModified:=True;
- SetCaption;
- end;
- end;
- Procedure TMainForm.EditCCPClick(Sender : TFPGtkObject; Data : Pointer);
- begin
- If Sender=FEditCut then
- EditCut
- else if Sender=FEditCopy then
- EditCopy
- else
- EditPaste;
- end;
- Procedure TMainForm.FileExitClick(Sender : TFPgtkObject; Data : Pointer);
- begin
- If CheckSaved then
- Close;
- end;
- Procedure TMainForm.HelpAboutClick(Sender : TFPGtkObject; Data : Pointer);
- begin
- With TAboutForm.Create do
- Execute(Nil,Nil,Nil);
- end;
- Procedure TMainForm.ProjectCompileClick(Sender : TFPGtkObject; Data : Pointer);
- begin
- Compile;
- end;
- Procedure TMainForm.ProjectOptionsClick(Sender : TFPGtkObject; Data : Pointer);
- begin
- SetOptions;
- end;
- Procedure TMainform.DoError(Sender : TObject; Msg : String);
- begin
- FMsgList.list.Add(TFPGtkListItem.CreateWithLabel(Msg));
- end;
- Procedure TMainform.DoVerbose(Sender : TObject; Msg : String);
- begin
- FMsgList.list.Add(TFPGtkListItem.CreateWithLabel(Msg));
- end;
- { ---------------------------------------------------------------------
- Auxiliary methods
- ---------------------------------------------------------------------}
- Procedure TMainForm.SetCaption;
- Var
- S : String;
- begin
- S:=SCaption;
- If (FFileName<>'') then
- S:=S+' : '+ExtractFileName(FFileName);
- If FModified then
- S:=S+' '+SModified;
- Title:=S;
- end;
- Function TMainForm.CheckSaved : Boolean;
- begin
- Result:=Not FModified;
- If Not Result then
- Case MessageDlg(SFileModified,mtInformation,mbYesNoCancel,0) of
- mrYes : begin
- FileSaveClick(Self,Nil);
- Result:=True;
- end;
- mrNo : Result:=True;
- mrCancel : Result:=False;
- end;
- end;
- Function TMainForm.GetFileName(ATitle : String) : String;
- var
- FS : TFPgtkFileSelection;
- begin
- Result:='';
- FS := TFPgtkFileSelection.Create (gtk_window_dialog);
- with FS do
- begin
- Title:=ATitle;
- OKButton.ConnectClicked (@(CloseWithResult), inttopointer(drOk));
- CancelButton.ConnectClicked (@(CloseWindow), nil);
- if Not execute (nil, @Result, @DialogSetFilename) = drOk then
- Result:='';
- end;
- end;
- Procedure TMainForm.DialogSetFilename(Sender : TFPGtkWindow;Data : Pointer; Action : Integer;Initiator : TFPGtkObject);
- type
- PString = ^AnsiString;
- begin
- PString(Data)^:=(Sender as TFPgtkFileSelection).Filename;
- end;
- { ---------------------------------------------------------------------
- Public methods
- ---------------------------------------------------------------------}
- Procedure TMainForm.LoadFromFile(FN : String);
- Var
- S : TStringList;
- begin
- S:=TStringList.Create;
- try
- S.LoadFromFile(FN);
- FEditor.TheText.Text:=S.Text;
- FModified:=False;
- Finally
- S.Free;
- end;
- FFileName:=FN;
- SetCaption;
- end;
- Procedure TMainForm.SaveToFile(FN : String);
- begin
- FFileName:=FN;
- FEditor.TheText.Lines.SaveToFile(FN);
- FModified:=False;
- SetCaption;
- end;
- Procedure TMainForm.EditCut;
- begin
- FEditor.TheText.CutClipBoard;
- end;
- Procedure TMainForm.EditCopy;
- begin
- FEditor.TheText.CopyCLipBoard;
- end;
- Procedure TMainForm.EditPaste;
- begin
- FEditor.TheText.PasteClipBoard;
- end;
- Procedure TMainForm.NewFile;
- begin
- Feditor.TheText.Clear;
- end;
- Procedure TMainForm.Compile;
- Var
- M,P,R,I : TStream;
- S,MsgFileName : String;
- Procedure SetupStreams;
- begin
- I:=TFileStream.Create(FFileName,fmOpenRead);
- If FCreatePas then
- P:=TFileStream.Create(ChangeFileExt(FFileName,'.pp'),fmCreate);
- If FCreateMsg then
- begin
- MsgFileName:=ChangeFileExt(FFileName,'.msg');
- M:=TFileStream.Create(MsgFileName,fmCreate);
- end;
- If FCreateRC then
- R:=TFileStream.Create(ChangeFileExt(FFileName,'.rc'),fmCreate);
- end;
- Procedure CloseStreams;
- begin
- M.Free;
- P.Free;
- R.Free;
- I.Free;
- end;
- begin
- FileSaveClick(Self,Nil);
- If (FUnitName='') then
- FUnitName:=ExtractFileName(FFileName);
- FMsgList.List.ClearAll;
- Try
- SetupStreams;
- Try
- With TMessageCompiler.Create do
- Try
- Msg:=M;
- MC:=I;
- RC:=R;
- Pas:=P;
- OnError:=@DoError;
- If FVerbose then
- OnVerbose:=@DoVerbose;
- UnitName:=FUnitName;
- MessageFileName:=MsgFileName;
- EscapeNeeded:=FEscapePath;
- If (FLanguageID<>-1) then
- LocaleID:=FLanguageID;
- If (FSubLanguageID<>-1) then
- SubLocaleID:=FSubLanguageID;
- If Compile then
- DoVerbose(Nil,SSuccesCompiling)
- else
- begin
- S:=Format(SErrsCompiling,[Errors]);
- DoVerbose(Nil,S);
- MessageDlg(S,mtError,[mbOK],0);
- end;
- Finally
- Free;
- end;
- Finally
- CloseStreams;
- end;
- except
- On E : Exception do
- MessageDlg(SErrUnexpected,[E.Message],mtError,[mbOK],0);
- end;
- end;
- Procedure TMainForm.SaveOptions(Sender : TFPGtkWindow;Data : Pointer; Action : Integer;Initiator : TFPGtkObject);
- begin
- With TOptionsForm(Data) do
- begin
- FUnitName:=UnitName;
- FLanguageID:=StrToIntDef(Trim(Locale),0);
- FSubLanguageID:=StrToIntDef(Trim(SubLocale),0);
- FVerbose:=Verbose;
- FCreateMsg:=CreateMsgFile;
- FCreatePas:=CreatePasFile;
- FCreateRC:=CreateRCFile;
- FEscapePath:=EscapePath;
- end;
- end;
- Procedure TMainForm.SetOptions;
- Var
- F : TOptionsForm;
- begin
- If (FUnitName='') and (FFileName<>'') then
- FUnitName:=ExtractFileName(FFileName);
- F:=TOptionsForm.Create;
- With F do
- begin
- UnitName:=FUnitName;
- Locale:=IntToStr(FLanguageID);
- SubLocale:=IntToStr(FSubLanguageID);
- Verbose:=Fverbose;
- CreateMsgFile:=FCreateMsg;
- CreatePasFile:=FCreatePas;
- CreateRCFile:=FCreateRC;
- EscapePath:=FEscapePath;
- Execute(Nil,F,@SaveOptions);
- end;
- end;
- end.
|