unit UnitfrmMenuMaker; interface uses SysUtils, Windows, Messages, Classes, Graphics, Controls, StdCtrls, ExtCtrls, Forms, TFlatMemoUnit, XPStyleActnCtrls, ActnList, ActnMan, ToolWin, ActnCtrls, ComCtrls, CorelButton, ImgList, TFlatEditUnit, TFlatCheckBoxUnit; type TfrmMenuMaker = class(TForm) pnlButtons: TPanel; cmdCancel: TCorelButton; ilButtons: TImageList; amButtons: TActionManager; acPaste: TAction; acCopy: TAction; acCut: TAction; acClear: TAction; acMenu: TAction; acGrey: TAction; acRed: TAction; acWhite: TAction; acYellow: TAction; cmdNext: TCorelButton; nbkPages: TNotebook; atbButtons: TActionToolBar; rtfEditor: TRichEdit; pnlSettings: TPanel; chkRegisterMenuCommand: TFlatCheckBox; chkAddComment: TFlatCheckBox; txtKeys: TFlatEdit; lblKeys: TLabel; bvlSpace: TBevel; lblSettings: TLabel; lblName: TLabel; txtMenuName: TFlatEdit; txtTime: TFlatEdit; chkUseTime: TFlatCheckBox; chkAppendOnlyMenuText: TFlatCheckBox; lblNote: TLabel; lblSettingsPlayers: TLabel; pnlSettingsPlayers: TPanel; lblMenu: TLabel; txtMenu: TFlatEdit; lblHelp: TLabel; chkAlive: TFlatCheckBox; bvlSpace2: TBevel; chkRegister: TFlatCheckBox; chkComments: TFlatCheckBox; chkImmunity: TFlatCheckBox; procedure acCopyExecute(Sender: TObject); procedure acCutExecute(Sender: TObject); procedure acPasteExecute(Sender: TObject); procedure acClearExecute(Sender: TObject); procedure acYellowExecute(Sender: TObject); procedure acWhiteExecute(Sender: TObject); procedure acRedExecute(Sender: TObject); procedure acGreyExecute(Sender: TObject); procedure txtKeysChange(Sender: TObject); procedure cmdCancelClick(Sender: TObject); procedure cmdNextClick(Sender: TObject); procedure rtfEditorKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure rtfEditorKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); procedure rtfEditorMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure rtfEditorMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure chkUseTimeClick(Sender: TObject); procedure txtMenuNameKeyPress(Sender: TObject; var Key: Char); procedure chkAppendOnlyMenuTextClick(Sender: TObject); procedure txtTimeChange(Sender: TObject); procedure rtfEditorChange(Sender: TObject); procedure acMenuExecute(Sender: TObject); procedure lblHelpMouseEnter(Sender: TObject); procedure lblHelpMouseLeave(Sender: TObject); procedure lblHelpClick(Sender: TObject); private Editing: Boolean; FDefaultMenu: Boolean; procedure SetDefaultMenu(const Value: Boolean); public property DefaultMenu: Boolean read FDefaultMenu write SetDefaultMenu; function GetColoredMenu: String; procedure SetButton(Action: TAction); procedure UpdateCurColor; procedure Reset; end; var frmMenuMaker: TfrmMenuMaker; implementation uses UnitAddMenu, UnitfrmSelectMenu, UnitfrmMain, UnitHowToMakePlayerMenu; {$R *.DFM} procedure TfrmMenuMaker.acCopyExecute(Sender: TObject); begin rtfEditor.CopyToClipboard; end; procedure TfrmMenuMaker.acCutExecute(Sender: TObject); begin rtfEditor.CutToClipboard; end; procedure TfrmMenuMaker.acPasteExecute(Sender: TObject); begin rtfEditor.PasteFromClipboard; end; procedure TfrmMenuMaker.acClearExecute(Sender: TObject); begin rtfEditor.Clear; rtfEditor.SelAttributes.Color := clWhite; UpdateCurColor; end; procedure TfrmMenuMaker.acYellowExecute(Sender: TObject); begin rtfEditor.SelAttributes.Color := clYellow; SetButton(acYellow); end; procedure TfrmMenuMaker.acWhiteExecute(Sender: TObject); begin rtfEditor.SelAttributes.Color := clWhite; SetButton(acWhite); end; procedure TfrmMenuMaker.acRedExecute(Sender: TObject); begin rtfEditor.SelAttributes.Color := clRed; SetButton(acRed); end; procedure TfrmMenuMaker.acGreyExecute(Sender: TObject); begin rtfEditor.SelAttributes.Color := clGray; SetButton(acGrey); end; procedure TfrmMenuMaker.SetButton(Action: TAction); begin if Action <> acYellow then acYellow.Checked := False; if Action <> acWhite then acWhite.Checked := False; if Action <> acRed then acRed.Checked := False; if Action <> acGrey then acGrey.Checked := False; Action.Checked := True; end; procedure TfrmMenuMaker.txtKeysChange(Sender: TObject); begin try StrToInt(Trim((Sender As TFlatEdit).Text)); except if Sender = txtKeys then begin (Sender As TFlatEdit).Text := '1'; SysUtils.Beep; end else (Sender As TFlatEdit).Text := ''; end; end; procedure TfrmMenuMaker.cmdCancelClick(Sender: TObject); begin if nbkPages.PageIndex = 0 then ModalResult := mrCancel else begin nbkPages.PageIndex := 0; if not DefaultMenu then begin lblNote.Visible := True; lblHelp.Visible := True; end; cmdCancel.Caption := 'Cancel'; cmdNext.Caption := '&Next >'; end; end; procedure TfrmMenuMaker.cmdNextClick(Sender: TObject); function IsNumeric(eChar: Char): Boolean; begin Result := Pos(eChar, '0123456789') <> 0; end; var i: integer; eColoredMenu: String; begin if Editing then begin eColoredMenu := GetColoredMenu; frmMain.sciEditor.Lines[frmSelectMenu.eLines[frmSelectMenu.GetItemIndex]] := StringReplace(frmMain.sciEditor.Lines[frmSelectMenu.eLines[frmSelectMenu.GetItemIndex]], '"' + frmSelectMenu.eMenuStr[frmSelectMenu.GetItemIndex] + '"', '"' + eColoredMenu + '"', []); Editing := False; ModalResult := mrOk; end else if nbkPages.PageIndex = 0 then begin // Editor if DefaultMenu then begin txtKeys.Text := '0'; for i := 0 to rtfEditor.Lines.Count -1 do begin if Length(rtfEditor.Lines[i]) <> 0 then begin if IsNumeric(rtfEditor.Lines[i][1]) then txtKeys.Text := txtKeys.Text + rtfEditor.Lines[i][1]; end; end; if Length(txtKeys.Text) <> 1 then txtKeys.Text := Copy(txtKeys.Text, 2, Length(txtKeys.Text)); nbkPages.PageIndex := 1; end else begin if Pos('$players', LowerCase(rtfEditor.Lines.Text)) = 0 then begin MessageBox(Handle, 'You forgot to set the players.', 'Warning', MB_ICONWARNING); exit; end; if (Pos('$next', LowerCase(rtfEditor.Lines.Text)) = 0) and (Pos('$back', LowerCase(rtfEditor.Lines.Text)) = 0) then MessageBox(Handle, 'You should set a "Next" and a "Back" key.', 'Warning', MB_ICONWARNING) else if Pos('$next', LowerCase(rtfEditor.Lines.Text)) = 0 then MessageBox(Handle, 'You should set a "Next"-key.', 'Warning', MB_ICONWARNING) else if Pos('$exitorback', LowerCase(rtfEditor.Lines.Text)) = 0 then MessageBox(Handle, 'You should set a "Back"-key.', 'Warning', MB_ICONWARNING); nbkPages.PageIndex := 2; end; cmdCancel.Caption := '< &Back'; cmdNext.Caption := 'Finish'; end else if nbkPages.PageIndex = 1 then begin // Default finish if (txtMenuName.Text = '') and (not chkAppendOnlyMenuText.Checked) then MessageBox(Handle, 'Invalid menu name.', 'Warning', MB_ICONWARNING) else begin Screen.Cursor := crHourGlass; if AddMenu then ModalResult := mrOk else MessageBox(Handle, 'Menu already exists. Please choose another name.', 'Warning', MB_ICONWARNING); Screen.Cursor := crDefault; end; end else begin // Player finish if (txtMenu.Text = '') then MessageBox(Handle, 'Invalid menu name.', 'Warning', MB_ICONWARNING) else begin if AddPlayerMenu then ModalResult := mrOk; Screen.Cursor := crDefault; end; end; lblNote.Visible := False; lblHelp.Visible := False; end; procedure TfrmMenuMaker.UpdateCurColor; begin case rtfEditor.SelAttributes.Color of clYellow: SetButton(acYellow); clWhite: SetButton(acWhite); clRed: SetButton(acRed); clGray: SetButton(acGrey); end; atbButtons.RecreateControls; end; procedure TfrmMenuMaker.rtfEditorKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin UpdateCurColor; end; procedure TfrmMenuMaker.rtfEditorKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin UpdateCurColor; end; procedure TfrmMenuMaker.rtfEditorMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin UpdateCurColor; end; procedure TfrmMenuMaker.rtfEditorMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin UpdateCurColor; end; procedure TfrmMenuMaker.chkUseTimeClick(Sender: TObject); begin txtTime.Enabled := chkUseTime.Checked; if not chkUseTime.Checked then txtTime.Text := '-1'; end; procedure TfrmMenuMaker.txtMenuNameKeyPress(Sender: TObject; var Key: Char); begin if Key = #32 then Key := #0; end; procedure TfrmMenuMaker.chkAppendOnlyMenuTextClick(Sender: TObject); begin lblKeys.Enabled := not chkAppendOnlyMenuText.Checked; txtKeys.Enabled := not chkAppendOnlyMenuText.Checked; chkAddComment.Enabled := not chkAppendOnlyMenuText.Checked; chkRegisterMenuCommand.Enabled := not chkAppendOnlyMenuText.Checked; chkUseTime.Enabled := not chkAppendOnlyMenuText.Checked; txtTime.Enabled := not chkAppendOnlyMenuText.Checked; lblName.Enabled := not chkAppendOnlyMenuText.Checked; txtMenuName.Enabled := not chkAppendOnlyMenuText.Checked; end; procedure TfrmMenuMaker.txtTimeChange(Sender: TObject); begin try if StrToInt(txtTime.Text) < -1 then begin txtTime.Text := '-1'; SysUtils.Beep; end; except txtTime.Text := '1000'; SysUtils.Beep; end; end; procedure TfrmMenuMaker.rtfEditorChange(Sender: TObject); begin cmdNext.Enabled := rtfEditor.Text <> ''; end; procedure TfrmMenuMaker.SetDefaultMenu(const Value: Boolean); begin FDefaultMenu := Value; lblNote.Visible := not Value; lblHelp.Visible := not Value; acMenu.Enabled := Value; Editing := False; if Value then Caption := 'Menu Maker' else Caption := 'Player Menu Maker'; end; procedure TfrmMenuMaker.acMenuExecute(Sender: TObject); var eTemp: String; begin if frmSelectMenu.ShowModal = mrOk then begin atbButtons.RecreateControls; if frmSelectMenu.GetItemIndex = -1 then frmSelectMenu.lstMenu.Selected[0] := True; DefaultMenu := True; Editing := True; rtfEditor.Clear; rtfEditor.SelAttributes.Color := clWhite; eTemp := frmSelectMenu.eMenuStr[frmSelectMenu.GetItemIndex]; if eTemp <> '' then begin while Length(eTemp) <> 0 do begin if eTemp[1] = '\' then begin if Length(eTemp) <> 1 then begin case LowerCase(eTemp[2])[1] of 'w': rtfEditor.SelAttributes.Color := clWhite; 'r': rtfEditor.SelAttributes.Color := clRed; 'd': rtfEditor.SelAttributes.Color := clGray; 'y': rtfEditor.SelAttributes.Color := clYellow; end; end; Delete(eTemp, 1, 2); end else if Copy(eTemp, 1, 2) = '^n' then begin rtfEditor.SelText := #13#10; Delete(eTemp, 1, 2); end else begin rtfEditor.SelText := eTemp[1]; Delete(eTemp, 1, 1); end; end; end; cmdNext.Caption := 'Finish edit'; end else atbButtons.RecreateControls; end; function TfrmMenuMaker.GetColoredMenu: String; var i: integer; eCurColor: TColor; begin eCurColor := clWhite; Result := ''; for i := 0 to Length(rtfEditor.Lines.Text) -1 do begin rtfEditor.SelStart := i; if rtfEditor.SelAttributes.Color <> eCurColor then begin eCurColor := rtfEditor.SelAttributes.Color; case eCurColor of clWhite : Result := Result + '\w'; clYellow: Result := Result + '\y'; clRed : Result := Result + '\r'; clGray : Result := Result + '\d'; end; end; Result := Result + rtfEditor.Lines.Text[i+1]; end; rtfEditor.SelStart := 0; Result := StringReplace(Result, #13, '^n', [rfReplaceAll]); Result := StringReplace(Result, #10, '', [rfReplaceAll]); end; procedure TfrmMenuMaker.Reset; begin rtfEditor.Clear; rtfEditor.SelAttributes.Color := clWhite; txtKeys.Text := '1'; txtMenu.Clear; txtMenuName.Clear; UpdateCurColor; end; procedure TfrmMenuMaker.lblHelpMouseEnter(Sender: TObject); begin lblHelp.Font.Color := clBlue; lblHelp.Font.Style := [fsUnderline]; end; procedure TfrmMenuMaker.lblHelpMouseLeave(Sender: TObject); begin lblHelp.Font.Color := clWindowText; lblHelp.Font.Style := []; end; procedure TfrmMenuMaker.lblHelpClick(Sender: TObject); procedure Append(eText: String); begin rtfEditor.SelText := eText + #13#10; rtfEditor.SelStart := Length(rtfEditor.Lines.Text); end; begin if frmHowToMakePlayerMenu.ShowModal = mrYes then begin rtfEditor.Clear; rtfEditor.SelAttributes.Color := clYellow; Append('Kick player'); Append(''); rtfEditor.SelAttributes.Color := clWhite; Append('$players(1,8,%n. %v)'); Append('$next(9,9. Next)'); Append(''); Append('$exitorback(0,0. Exit,0. Back)'); end; end; end.