Ver código fonte

UPD: Refactor TEditButtonEx and TFileViewWithMainCtrl (#585)

* UPD: Refactor TEditButtonEx and TFileViewWithMainCtrl (refer to the implementation of KASPathEdit)

* FIX: WIN32: add the related codes of VK_RIGHT and VK_LEFT back
rich2014 3 anos atrás
pai
commit
3576a6c165
1 arquivos alterados com 151 adições e 128 exclusões
  1. 151 128
      src/fileviews/ufileviewwithmainctrl.pas

+ 151 - 128
src/fileviews/ufileviewwithmainctrl.pas

@@ -57,12 +57,25 @@ type
 
   TEditButtonEx = class(TEditButton)
   private
+{$IFDEF LCLCOCOA}
+    originalText: String;
+    keyDownText: String;
+{$ENDIF}
+    procedure handleSpecialKeys( Key: Word );
     function GetFont: TFont;
     procedure SetFont(AValue: TFont);
   protected
     function CalcButtonVisible: Boolean; override;
     function GetDefaultGlyphName: String; override;
+    procedure EditKeyDown(var Key: word; Shift: TShiftState); override;
+{$IFDEF LCLCOCOA}
+    procedure EditEnter; override;
+    procedure EditChange; override;
+    procedure EditKeyUp(var Key: word; Shift: TShiftState); override;
+{$ENDIF}
   public
+    onKeyESCAPE: TNotifyEvent;
+    onKeyRETURN: TNotifyEvent;
     property Font: TFont read GetFont write SetFont;
   end;
 
@@ -94,20 +107,14 @@ type
     procedure edtRenameEnter(Sender: TObject);
     procedure edtRenameExit(Sender: TObject);
     procedure edtRenameButtonClick(Sender: TObject);
-    procedure handleKey(Sender: TObject; var Key: Word; Shift: TShiftState);
-    {$IFDEF LCLCOCOA}
-    procedure edtRenameKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
-    procedure edtRenameKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
-    procedure edtRenameOnChange(Sender: TObject);
-    {$ENDIF}
     procedure edtRenameMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
 
+{$IFDEF LCLWIN32}
+    procedure edtRenameKeyDown(Sender: TObject; var Key: word; Shift: TShiftState);
+{$ENDIF}
+    procedure edtRenameOnKeyESCAPE(Sender: TObject);
+    procedure edtRenameOnKeyRETURN(Sender: TObject);
   protected
-    {$IFDEF LCLCOCOA}
-      originalText: String;
-      keyDownText: String;
-    {$ENDIF}
-
     edtRename: TEditButtonEx;
     FRenameFile: TFile;
     FRenFile:TRenameFileEditInfo;
@@ -237,6 +244,79 @@ type
 
 { TEditButtonEx }
 
+{$IFDEF LCLCOCOA}
+procedure TEditButtonEx.EditEnter;
+begin
+  inherited EditEnter;
+  self.originalText:= self.Text;
+end;
+
+procedure TEditButtonEx.EditChange;
+begin
+  inherited EditChange;
+  self.originalText:= self.Text;
+end;
+
+procedure TEditButtonEx.EditKeyDown( var Key: Word; Shift: TShiftState );
+begin
+  case Key of
+    VK_ESCAPE:
+      self.keyDownText:= self.Text;
+    VK_RETURN,
+    VK_SELECT:
+      self.keyDownText:= self.originalText
+  end;
+  inherited EditKeyDown( Key, Shift );
+end;
+
+procedure TEditButtonEx.EditKeyUp( var Key: Word; Shift: TShiftState );
+begin
+  case Key of
+    VK_ESCAPE,
+    VK_RETURN,
+    VK_SELECT:
+      if self.text=self.keyDownText then
+        // from the text has not been changed,
+        // the EditButton is not in the IME state
+        handleSpecialKeys( Key )
+      else
+        Key:= 0;
+  end;
+  inherited EditKeyUp( Key, Shift );
+end;
+
+{$ELSE}
+
+procedure TEditButtonEx.EditKeyDown(var Key: Word; Shift: TShiftState);
+begin
+  inherited EditKeyDown(Key, Shift);
+
+  case Key of
+    VK_ESCAPE,
+    VK_RETURN,
+    VK_SELECT:
+      handleSpecialKeys( Key );
+
+{$IFDEF LCLGTK2}
+    // Workaround for GTK2 - up and down arrows moving through controls.
+    VK_UP,
+    VK_DOWN:
+      Key := 0;
+{$ENDIF}
+  end;
+end;
+
+{$ENDIF}
+
+procedure TEditButtonEx.handleSpecialKeys( Key: Word );
+begin
+  if Key=VK_ESCAPE then begin
+    if Assigned(onKeyESCAPE) then onKeyESCAPE( self );
+  end else begin
+    if Assigned(onKeyRETURN) then onKeyRETURN( self );
+  end;
+end;
+
 function TEditButtonEx.GetFont: TFont;
 begin
   Result:= BaseEditor.Font;
@@ -259,6 +339,60 @@ end;
 
 { TFileViewWithMainCtrl }
 
+
+{$IFDEF LCLWIN32}
+procedure TFileViewWithMainCtrl.edtRenameKeyDown(Sender: TObject; var Key: word; Shift: TShiftState);
+begin
+  case Key of
+    // Workaround for Win32 - right arrow must clear selection at first move.
+    VK_RIGHT:
+      begin
+        if (Win32MajorVersion < 10) and (Shift = []) and (edtRename.SelLength > 0) then
+        begin
+          Key := edtRename.CaretPos.X;
+          edtRename.SelLength := 0;
+          edtRename.CaretPos := Classes.Point(Key, 0);
+          Key := 0;
+        end;
+        FRenFile.UserManualEdit:=True; // user begin manual edit - no need cycle Name,Ext,FullName selection
+      end;
+     VK_LEFT:
+        FRenFile.UserManualEdit:=True; // user begin manual edit - no need cycle Name,Ext,FullName selection
+  end;
+end;
+{$ENDIF}
+
+procedure TFileViewWithMainCtrl.edtRenameOnKeyESCAPE(Sender: TObject);
+begin
+  edtRename.Visible:=False;
+  SetFocus;
+end;
+
+procedure TFileViewWithMainCtrl.edtRenameOnKeyRETURN(Sender: TObject);
+var
+  NewFileName: String;
+  OldFileNameAbsolute: String;
+begin
+  NewFileName         := edtRename.Text;
+  OldFileNameAbsolute := edtRename.Hint;
+
+  try
+    case RenameFile(FileSource, FRenameFile, NewFileName, True) of
+      sfprSuccess:
+        begin
+          edtRename.Visible:=False;
+          SetActiveFile(CurrentPath + NewFileName);
+          SetFocus;
+        end;
+      sfprError:
+        msgError(Format(rsMsgErrRename, [ExtractFileName(OldFileNameAbsolute), NewFileName]));
+    end;
+  except
+    on e: EInvalidFileProperty do
+      msgError(Format(rsMsgErrRename + ':' + LineEnding + '%s (%s)', [ExtractFileName(OldFileNameAbsolute), NewFileName, rsMsgInvalidFileName, e.Message]));
+  end;
+end;
+
 procedure TFileViewWithMainCtrl.ClearAfterDragDrop;
 begin
   tmMouseScroll.Enabled := False;
@@ -316,13 +450,11 @@ begin
   edtRename.Visible := False;
   edtRename.TabStop := False;
   edtRename.AutoSize := False;
-  {$IFDEF LCLCOCOA}
-  edtRename.OnKeyDown := @edtRenameKeyDown;
-  edtRename.OnKeyUp := @edtRenameKeyUp;
-  edtRename.OnChange := @edtRenameOnChange;
-  {$ELSE}
-  edtRename.OnKeyDown := @handleKey;
-  {$ENDIF}
+{$IFDEF LCLWIN32}
+  edtRename.onKeyDown:=@edtRenameKeyDown;
+{$ENDIF}
+  edtRename.onKeyESCAPE:=@edtRenameOnKeyESCAPE;
+  edtRename.onKeyRETURN:=@edtRenameOnKeyRETURN;
   edtRename.OnMouseDown:=@edtRenameMouseDown;
   edtRename.OnEnter := @edtRenameEnter;
   edtRename.OnExit := @edtRenameExit;
@@ -1444,9 +1576,6 @@ end;
 
 procedure TFileViewWithMainCtrl.edtRenameEnter(Sender: TObject);
 begin
-  {$IFDEF LCLCOCOA}
-  originalText:= edtRename.Text;
-  {$ENDIF}
   FWindowProc:= MainControl.WindowProc;
   MainControl.WindowProc:= @MainControlWindowProc;
 end;
@@ -1463,115 +1592,9 @@ begin
 end;
 
 procedure TFileViewWithMainCtrl.edtRenameButtonClick(Sender: TObject);
-var
-  Key: Word = VK_RETURN;
-begin
-  handleKey(Sender, Key, []);
-end;
-
-{$IFDEF LCLCOCOA}
-procedure TFileViewWithMainCtrl.edtRenameKeyDown(Sender: TObject;
-  var Key: Word; Shift: TShiftState);
-begin
-  if key=VK_RETURN then
-    keyDownText:= originalText
-  else if key=VK_ESCAPE then
-    keyDownText:= edtRename.Text;
-end;
-
-procedure TFileViewWithMainCtrl.edtRenameOnChange(Sender: TObject);
-begin
-  originalText:= edtRename.Text;
-end;
-
-procedure TFileViewWithMainCtrl.edtRenameKeyUp(Sender: TObject;
-  var Key: Word; Shift: TShiftState);
-var
-  currentText: String;
 begin
-  currentText:= edtRename.Text;
-  if (Key=VK_RETURN) or (key=VK_ESCAPE) then
-  begin
-      if currentText<>keyDownText then
-      begin
-        // From the text has been changed,
-        // the EditButton is in the IME state, just return
-        Key:= 0;
-        exit;
-      end;
-  end;
-  handleKey( Sender, Key, Shift );
+  edtRenameOnKeyRETURN(Sender);
 end;
-{$ENDIF}
-
-procedure TFileViewWithMainCtrl.handleKey(Sender: TObject;
-  var Key: Word; Shift: TShiftState);
-var
-  NewFileName: String;
-  OldFileNameAbsolute: String;
-begin
-
-  case Key of
-    VK_ESCAPE:
-      begin
-        Key := 0;
-        edtRename.Visible:=False;
-        SetFocus;
-      end;
-
-    VK_RETURN,
-    VK_SELECT:
-      begin
-        Key := 0; // catch the enter
-
-        NewFileName         := edtRename.Text;
-        OldFileNameAbsolute := edtRename.Hint;
-
-        try
-          case RenameFile(FileSource, FRenameFile, NewFileName, True) of
-            sfprSuccess:
-              begin
-                edtRename.Visible:=False;
-                SetActiveFile(CurrentPath + NewFileName);
-                SetFocus;
-              end;
-            sfprError:
-              msgError(Format(rsMsgErrRename, [ExtractFileName(OldFileNameAbsolute), NewFileName]));
-          end;
-
-        except
-          on e: EInvalidFileProperty do
-            msgError(Format(rsMsgErrRename + ':' + LineEnding + '%s (%s)', [ExtractFileName(OldFileNameAbsolute), NewFileName, rsMsgInvalidFileName, e.Message]));
-        end;
-      end;
-
-{$IFDEF LCLGTK2}
-    // Workaround for GTK2 - up and down arrows moving through controls.
-    VK_UP,
-    VK_DOWN:
-      Key := 0;
-{$ENDIF}
-
-{$IFDEF LCLWIN32}
-    // Workaround for Win32 - right arrow must clear selection at first move.
-    VK_RIGHT:
-      begin
-        if (Shift = []) and (edtRename.SelLength > 0) then
-        begin
-          Key := edtRename.CaretPos.X;
-          edtRename.SelLength := 0;
-          edtRename.CaretPos := Classes.Point(Key, 0);
-          Key := 0;
-        end;
-        FRenFile.UserManualEdit:=True; // user begin manual edit - no need cycle Name,Ext,FullName selection
-      end;
-     VK_LEFT:
-        FRenFile.UserManualEdit:=True; // user begin manual edit - no need cycle Name,Ext,FullName selection
-
-{$ENDIF}
-  end;
-end;
-
 
 procedure TFileViewWithMainCtrl.edtRenameMouseDown(Sender: TObject;
   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);