Search the Community
Showing results for tags 'drag drop'.
-
Like the Title says. My goal is to change the default behaviour of Scite (move dragged text if you drag only with the mouse and copy the text if you press Ctrl while dragging), to that bahaviour that you copy the text if you only drag, and move the text if you press shift while dragging. Why? I created a Scite assist script that will do the following action: - If you press the middle mouse button over a word in scite(marked or not), it will select the word and behave like you would normally drag the word with the left mouse button. - While the middle mouse button is pressed, you can type any abbreviation ie. "cw" (Consolewrite) and if you let go, it will insert that abbreviation and insert the dragged text into it. You can imagine that pressing ctrl while holding the mouse button and typing in the abbrev letters is a bit of a problem and workflow killer, so it would be cool if it would copy the text by default. I have read a bit in MSDN but this is a little over my horizon: http://msdn.microsoft.com/en-us/library/windows/desktop/ms692464%28v=vs.85%29.aspx http://msdn.microsoft.com/en-us/library/ms693457%28VS.85%29.aspx The other thing is that i dont know how to hook into the scite window messages or if this is possible after all. Maybe it is possible to write a scite lua script to assist with that issue? Im open for any hint. Oh and here is my unfinished script. Its working like i want it to, but its a lot MouseClick and MouseDown and set switches to execute in mainloop and so on. I would appreciate a more efficient solution. #Include <Array.au3> #Include <WindowsConstants.au3> #include <WinAPI.au3> #include <Misc.au3> ;~ opt("MouseClickDragDelay",10) Global Const $MSLLHOOKSTRUCT = $tagPOINT & ";dword mouseData;dword flags;dword time;ulong_ptr dwExtraInfo" Dim $KeyChangedArr[256] Dim $KeyPressedArr[256] $XBut1 = 0 $XBut2 = 0 $MBut = "" $charbuffer = "" $Wheeltimer = TimerInit() $ArrDis = 0 $SciteRecv = "" Dim $MousePos[2] Dim $VarSortArr[10][2] ;~ Opt("GUIOnEventMode", 1) Opt("TrayAutoPause", 0) Opt("TrayOnEventMode", 1) Opt("TrayMenuMode", 1) ; Default tray menu items (Script Paused/Exit) will not be shown. TrayCreateItem("Exit") TrayItemSetOnEvent(-1, "ExitF") $SciteW_hwnd = WinGetHandle("[CLASS:SciTEWindow]") $SciteWC_hwnd = ControlGetHandle("[CLASS:SciTEWindow]","","Scintilla1") $Scite_hwnd = WinGetHandle("DirectorExtension") $My_Hwnd = GUICreate("SciTE interface", 400, 600, 10, 10); For communication with Scite GUIRegisterMsg($WM_COPYDATA, "MY_WM_COPYDATA"); For communication with Scite HotKeySet("{ESC}", "ExitF") OnAutoItExitRegister("ExitF") ; ### Register Mouse Hook ### $hMouseProc = DllCallbackRegister("_Mouse_Proc", "int", "int;ptr;ptr") $hMouseHook = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($hMouseProc), _WinAPI_GetModuleHandle(0)) ; ########################### ; ### Register Keyboard Hook ### $hKeyProc = DllCallbackRegister("_KeyProc", "long", "int;wparam;lparam") $hKeyHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hKeyProc), _WinAPI_GetModuleHandle(0)) ; ########################### Func MouseEvent($wParam, $ptx, $pty, $mouseData, $flags) ;~ If not ($wParam = $WM_MOUSEMOVE) Then ConsoleWrite("Mevent: "&$wParam &", Data: "&$mouseData & ", Flags: " &$flags & @CRLF) ;~ Local $_blocked = 1; block mouse event by default if not explicit allowed in the case statement for this event Local $_blocked = 0; allow mouse event by default if not explicit denied in the case statement for this event if WinActive($SciteW_hwnd) and $flags = 0 Then ;~ if $flags then Return $_blocked Switch $wParam Case $WM_MOUSEWHEEL $Wheeltimer = TimerInit() case 0x020B ; Xbutton1 dwn If $mouseData = 65536 Then $XBut1 = 1 $charbuffer = ""; to see if we type anything while pressed Elseif $mouseData = 131072 Then ; Xbutton2 dwn $XBut2 = 1 EndIf case 0x020C ; Xbutton1 up If $mouseData = 65536 Then if $charbuffer = "" Then $l_sw = SendSciTE_GetInfo($My_Hwnd, $Scite_hwnd, "askproperty:CurrentSelection") if $l_sw = "" Then ControlSend($SciteW_hwnd,"","",'{ASC 34}{ASC 34}{LEFT}'); send: "" and put cursor in middle Else SendSciTE_Command($My_Hwnd, $Scite_hwnd, "insert:"&'"'&$l_sw&'"'); insert ;~ ControlSend($SciteW_hwnd,"","",'"'&$l_sw&'"') EndIf ;~ send('{ASC 34}') ; send: " (if we didnt type anything while pressed) $XBut1 = 0 Else $XBut1 = "abbrevcheck" EndIf Elseif $mouseData = 131072 Then ; Xbutton2 up $XBut2 = 0 send('{ASC 38}') ; send: & EndIf case 0x0207 ; $WM_MBUTTONDOWN $MBut = "pressed" $charbuffer = ""; to see if we type anything while pressed $MousePos = MouseGetPos() $MousePos = MouseGetPos() case 0x0208 ; $WM_MBUTTONUP If $MBut = "drag" or $MBut = "dragctrldown" Then ControlSend($SciteW_hwnd,"","","{ESC}"); Abort the Windows Drag&Drop ;~ send("{ESC down}") ;~ Sleep(100) ;~ send("{ESC up}") MouseUp("left") ;~ Send("{ASC 0xA3 up}") $MBut = "abbrevcheck"; Execute abbrev check in Main Loop ElseIf TimerDiff($Wheeltimer) > 200 Then send('{ASC 91}{ASC 93}{left}') ; send: [] and put cursor in middle EndIf Case $WM_MOUSEMOVE if $MBut = "pressed" Then $tMpos = MouseGetPos() If abs($MousePos[0] - $tMpos[0]) > 1 or abs($MousePos[1] - $tMpos[1]) > 1 Then; If we draged with Middle Button 1 pixel MouseUp("middle") ;~ MouseClick("left") ;~ SendSciTE_Command($My_Hwnd, $Scite_hwnd,"extender:dostring editor:SetSel(editor:WordStartPosition(editor.CurrentPos, true),editor:WordEndPosition(editor.CurrentPos, true))") ;~ sleep(50) ; This is actually faster, but baby what a clickfest, and this inside a winproc function.. MouseClick("left") MouseClick("left") MouseMove($tMpos[0]+5,$tMpos[1],0); Cant click 3 times with mouse on same spot, this would cause "select whole line", so move it a little MouseDown("left") ; Emulated Drag start $MBut = "drag" EndIf EndIf Case $WM_LBUTTONUP,$WM_RBUTTONUP Return $_blocked ; <--- Comment out to enable Array Live Display on Variable Click $Sciteword = SendSciTE_GetInfo($My_Hwnd, $Scite_hwnd, "askproperty:CurrentWord") ;~ ConsoleWrite($Sciteword & @CRLF) For $i = 0 To UBound($VarSortArr)-1 $VarSortArr[$i][1] = round($VarSortArr[$i][1],1) ; to clear floating point errors if $VarSortArr[$i][1] then $VarSortArr[$i][1] -= 0.2 ; update frequency value next $isVarArr = StringRegExp($Sciteword,"A$w+?Z",3); only word if IsArray($isVarArr) Then $isVarArr = $isVarArr[0] ConsoleWrite($isVarArr & @CRLF) SortIntoArray($isVarArr) _AD($VarSortArr,"") ; Display the Recent Variables Array else EndIf ;~ Case $WM_LBUTTONUP ;~ Case $WM_RBUTTONDOWN ;~ Case $WM_RBUTTONUP ;~ Case Else ;~ ConsoleWrite("Mevent: "&$wParam &", Data: "&$mouseData & ", Flags: " &$flags & @CRLF) ;~ If $flags Then $_blocked = 0 ;-> proceed normal EndSwitch EndIf Return $_blocked EndFunc Func KeyEvent($keycode, $scancode, $flags, $char) ;~ Local $_blocked = 1; block key event by default if not explicit allowed in the case statement for this event Local $_blocked = 0; allow key event by default if not explicit denied in the case statement for this event Local $_UD = _Iif((BitAND($flags,128) = 0),"D",False) Switch $KeyChangedArr[$keycode] Case $_UD,"G" $KeyChangedArr[$keycode] = False If $_UD = "D" Then $KeyChangedArr[$keycode] = "G" Case Else $KeyChangedArr[$keycode] = $_UD EndSwitch $KeyPressedArr[$keycode] = (BitAND($flags,128) = 0) $chrchar = chr($char) if number($char) = 0 then $chrchar = "NUL" ;~ ConsoleWrite("VK: 0x"& Hex($keycode,2) & ", SC: "&Hex($scancode,3)&@tab&", Char: "&$chrchar&"("& $char&")"&@tab&@tab&" " &@tab&" Changed: "&$KeyChangedArr[$keycode]&@tab&" Pressed: "&$KeyPressedArr[$keycode]& @CRLF) ;~ ConsoleWrite(@tab&"extended-key:" &@tab&@tab&BitAND($flags,$LLKHF_EXTENDED) &@crlf) ;~ ConsoleWrite(@tab&"injected flag:" &@tab&@tab&BitAND($flags,$LLKHF_INJECTED) &@crlf) ;~ ConsoleWrite(@tab&"context code(ALT DOWN):" &@tab&BitAND($flags,$LLKHF_ALTDOWN) &@crlf) ;~ ConsoleWrite(@tab&"transition state(UP):" &@tab&BitAND($flags,$LLKHF_UP) &@crlf) #cs #### OnKey Switch Code ##### If WinActive($SciteW_hwnd) Then Switch $keycode Case 0x0D ; Enter if $KeyChangedArr[$keycode] Then; block any Enter event ;~ ConsoleWrite("oh mann" & @CRLF) ;~ $Sciteword = SendSciTE_Command($My_Hwnd, $Scite_hwnd, 'macrolist:Test Test1') ;~ $Sciteword = SendSciTE_Command($My_Hwnd, $Scite_hwnd,"extension:editor.GotoPos(184)") ;~ $Sciteword = SendSciTE_Command($My_Hwnd, $Scite_hwnd,"extender:dostring editor:SetSel(editor:WordStartPosition(editor.CurrentPos, true),editor:WordEndPosition(editor.CurrentPos, true))") $Sciteword = SendSciTE_GetInfo($My_Hwnd, $Scite_hwnd, "askproperty:CurrentWord") ConsoleWrite($Sciteword & @CRLF) ;~ $ArrDis = 1 $_blocked = 1 Return $_blocked EndIf EndSwitch If $KeyPressedArr[$keycode] Then; any key DOWN event if not BitAND($flags,$LLKHF_EXTENDED) and ($XBut1 or $MBut) Then $charbuffer &= chr($char) $_blocked = 1 EndIf EndIf EndIf #ce Return $_blocked EndFunc ; ######## Main Loop ######## While 1 Sleep(10) If $MBut = "abbrevcheck" Then $Sciteword = SendSciTE_GetInfo($My_Hwnd, $Scite_hwnd, "askproperty:CurrentSelection") MouseClick("left"); We sent ESC but then cursor will be on the start drag position, so click 1 time so reset cursor If $charbuffer Then ; did we type anything while button was pressed ConsoleWrite("M Open Abbrev Win.." & @CRLF) ControlSend($SciteW_hwnd,"","","^+{r}") ;~ SendSciTE_Command($My_Hwnd, $Scite_hwnd, "menucommand:247"); blocks execution of script :- While 1 if WinExists("Insert Abbreviation") then ExitLoop Sleep(50) WEnd ControlSend($SciteW_hwnd,"","",$charbuffer&"{Enter}") $charbuffer = "" sleep(50) EndIf ;~ if $Sciteword then ControlSend($SciteW_hwnd,"","",$Sciteword) ; This is faster if $Sciteword then SendSciTE_Command($My_Hwnd, $Scite_hwnd, "insert:"&$Sciteword); insert Text $MBut = "" EndIf if $XBut1 = "abbrevcheck" and $charbuffer Then ; did we type anything while button was pressed ConsoleWrite("gi" & @CRLF) $Sciteword = SendSciTE_GetInfo($My_Hwnd, $Scite_hwnd, "askproperty:CurrentSelection") ConsoleWrite("X Open Abbrev Win.." & @CRLF) ControlSend($SciteW_hwnd,"","","^+{r}"); Open Abbrev Dialoge ;~ SendSciTE_Command($My_Hwnd, $Scite_hwnd, "menucommand:247"); not usable --> blocks execution of this script :- While 1 if WinExists("Insert Abbreviation") then ExitLoop Sleep(50) WEnd ControlSend($SciteW_hwnd,"","",$charbuffer&"{Enter}") sleep(50) if $Sciteword = "" then SendSciTE_Command($My_Hwnd, $Scite_hwnd, "menucommand:205"); Paste $charbuffer = "" $XBut1 = 0 EndIf If not $charbuffer Then; nothing wrote while button down If $MBut = "abbrevcheck" Then ConsoleWrite("MainLoop: ctrlup" & @CRLF) $MBut = "" ElseIf $MBut = "drag" Then ConsoleWrite("MainLoop: ctrldown" & @CRLF) $MBut = "dragctrldown" EndIf EndIf WEnd Func _Mouse_Proc($nCode, $wParam, $lParam) ;function called for mouse events.. If $nCode < 0 Then Return _WinAPI_CallNextHookEx($hMouseHook, $nCode, $wParam, $lParam) EndIf Local $info, $ptx, $pty, $mouseData, $flags, $_blocked = 1 $info = DllStructCreate($MSLLHOOKSTRUCT, $lParam) ;used to get all data in the struct ($lParam is the ptr) $ptx = DllStructGetData($info, 1) ;see notes below.. $pty = DllStructGetData($info, 2) $mouseData = DllStructGetData($info, 3) $flags = DllStructGetData($info, 4) If MouseEvent($wParam, $ptx, $pty, $mouseData, $flags) Then Return 1 Return _WinAPI_CallNextHookEx($hMouseHook, $nCode, $wParam, $lParam) EndFunc ;==>_Mouse_Proc Func _KeyProc($nCode, $wParam, $lParam) ;function called for Key events.. ;~ ConsoleWrite("$nCode: "& $nCode & ", $wParam: "& $wParam& ", $lParam: "& $lParam & @CRLF) Local $tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam) If $nCode < 0 Then ;must return if $nCode less than zero or return when not Activated and not the Toggle Key Return _WinAPI_CallNextHookEx($hKeyHook, $nCode, $wParam, $lParam) EndIf ;~ DllStructGetData($tKEYHOOKS, "scanCode") Local $tKbdState = DllStructCreate("byte[256];") ; A pointer to a 256-byte array that contains the current keyboard state. Local $aResult = DllCall("user32.dll", "int", "GetKeyboardState", "ptr", DllStructGetPtr($tKbdState)) Local $tChar = DllStructCreate("WORD buff;") $aResult = DllCall("user32.dll", "int", "ToAscii", "uint", DllStructGetData($tKEYHOOKS, "VkCode"), "uint", DllStructGetData($tKEYHOOKS, "scanCode"), "ptr", DllStructGetPtr($tKbdState), "ptr", DllStructGetPtr($tChar), "uint", 0) local $sData = "" Switch $aResult[0] Case 0 ; The specified virtual key has no translation for the current state of the keyboard. ;~ $sData = "No: "&DllStructGetData($tChar, "buff")&DllStructGetData($tChar, 1) Case 1 ; One character was copied to the buffer. If BitAND(DllStructGetData($tKEYHOOKS, "flags"),$LLKHF_ALTDOWN) Then ;~ $sData = DllStructGetData($tChar, 2)&DllStructGetData($tChar, 1) Else $sData = DllStructGetData($tChar, "buff")&"" EndIf Case 2 ; Two characters were copied to the buffer. This usually happens when a dead-key character (accent or diacritic) stored in the keyboard ;~ layout cannot be composed with the specified virtual key to form a single character. ;~ $sData = "Special: "&DllStructGetData($tChar, "buff") case Else $sData = "!ERROR return value from DllCall: "&$aResult[0] EndSwitch If KeyEvent(DllStructGetData($tKEYHOOKS, "VkCode"), DllStructGetData($tKEYHOOKS, "scanCode") , DllStructGetData($tKEYHOOKS, "flags"), $sData) Then Return 1 Return _WinAPI_CallNextHookEx($hKeyHook, $nCode, $wParam, $lParam) EndFunc ;==>_KeyProc ; Send command to SciTE Func SendSciTE_Command($My_Hwnd, $Scite_hwnd, $sCmd) ConsoleWrite('-->' & $sCmd & @lf ) ;~ GUICtrlSetData($list,GUICtrlRead($list) & '-->' & $sCmd & @CRLF) Local $CmdStruct = DllStructCreate('Char[' & StringLen($sCmd) + 1 & ']') DllStructSetData($CmdStruct, 1, $sCmd) Local $COPYDATA = DllStructCreate('Ptr;DWord;Ptr') DllStructSetData($COPYDATA, 1, 1) DllStructSetData($COPYDATA, 2, StringLen($sCmd) + 1) DllStructSetData($COPYDATA, 3, DllStructGetPtr($CmdStruct)) DllCall('User32.dll', 'None', 'SendMessage', 'HWnd', $Scite_hwnd, _ 'Int', $WM_COPYDATA, 'HWnd', $My_Hwnd, _ 'Ptr', DllStructGetPtr($COPYDATA)) EndFunc ;==>SendSciTE_Command ; ; Func SendSciTE_GetInfo($My_Hwnd, $Scite_hwnd, $sCmd) $My_Dec_Hwnd = Dec(StringTrimLeft($My_Hwnd, 2)) $sCmd = ":" & $My_Dec_Hwnd & ":" & $sCmd $SciteRecv = "" $SaveSciTECmd = "xxxxx" SendSciTE_Command($My_Hwnd, $SciTE_hwnd,$sCmd) For $x = 1 To 10 If $SciteRecv <> "" Then ExitLoop sleep(20) Next $SciteRecv = StringTrimLeft($SciteRecv,StringLen(":" & $My_Dec_Hwnd & ":")) $SciteRecv = StringReplace($SciteRecv,"macro:stringinfo:","") ConsoleWrite('<--' & $SciteRecv & @lf ) Return $SciteRecv EndFunc ; Received Data from SciTE Func MY_WM_COPYDATA($hWnd, $msg, $wParam, $lParam) Local $COPYDATA = DllStructCreate('Ptr;DWord;Ptr',$lparam) $bufLen = DllStructGetData($COPYDATA, 2) Local $CmdStruct = DllStructCreate('Char[4096]',DllStructGetData($COPYDATA, 3)) $SciteRecv = Stringleft(DllStructGetData($CmdStruct, 1),$bufLen) ;~ ConsoleWrite('<--' & $SciteRecv & @CRLF) ;GUICtrlSetData($list,GUICtrlRead($list) & '<--' & $SciteRecv & @CRLF ) EndFunc ;==>MY_WM_COPYDATA Func SortIntoArray($_VarString) For $i = 0 To UBound($VarSortArr)-1 if $VarSortArr[$i][0] = $_VarString then ;~ ConsoleWrite("Found at: "&$i & @CRLF) ;~ $VarSortArr[$i][1] += 1 if $VarSortArr[$i][1] <= 9 then $VarSortArr[$i][1] += 1 FastSortItemin2DArray($VarSortArr, $i, 1) $i = -1 ExitLoop EndIf next If not ($i = -1) Then; No match found, this is a new value For $i = 0 To UBound($VarSortArr)-1 if (not $VarSortArr[$i][0] and not $VarSortArr[$i][0]) Then ExitLoop; We found an empty row if $i = UBound($VarSortArr)-1 Then; we are at last index of array and no empty row was found ReDim $VarSortArr[UBound($VarSortArr)+10][2]; extend array $i += 1 ; set $i to the next free index ExitLoop EndIf next $VarSortArr[$i][0] = $_VarString $VarSortArr[$i][1] = 10 ;~ ConsoleWrite("Empty row at: "&$i & @CRLF) FastSortItemin2DArray($VarSortArr, $i, 1) EndIf EndFunc Func FastSortItemin2DArray(ByRef $a_Array, $_index, $_subitem) If $_index > 0 then; If we not already on top For $_index2 = $_index-1 To 0 step -1 if $a_Array[$_index2][$_subitem] > $a_Array[$_index-1][$_subitem] Then; search for the next higher value of the newly updated value _ArraySwap($a_Array[$_index2+1][0], $a_Array[$_index][0]); swap with one index lower (so that we are on top of all equal values) _ArraySwap($a_Array[$_index2+1][1], $a_Array[$_index][1]) If $a_Array[$_index2][$_subitem] < $a_Array[$_index2+1][$_subitem] Then FastSortItemin2DArray($a_Array, $_index2+1, $_subitem); Recursive execution for every higher value EndIf ExitLoop EndIf if ($_index2 = 0 and $a_Array[0][$_subitem] <= $a_Array[$_index][$_subitem]) then; special case: if $_index2 = 0 we dont have any value that is higher, so we need this check here _ArraySwap($a_Array[$_index2][0], $a_Array[$_index][0]); swap if first item of array is equal or lower _ArraySwap($a_Array[$_index2][1], $a_Array[$_index][1]) ExitLoop EndIf next Else ;~ ConsoleWrite("Im #1 so why try harder" & @CRLF) EndIf EndFunc Func ExitF() ;~ ConsoleWrite("Exit CTRL up" & @CRLF) ;~ Send("{RCTRL down}") ;~ Send("{RCTRL up}") ;~ Send("{LCTRL down}") ;~ Send("{LCTRL up}") _WinAPI_UnhookWindowsHookEx($hMouseHook) DllCallbackFree($hMouseProc) _WinAPI_UnhookWindowsHookEx($hKeyHook) DllCallbackFree($hKeyProc) Exit EndFunc Func _AD(Const ByRef $avArray, $sTitle = "Array: ListView Display", $iItemLimit = -1, $iTranspose = 0, $sSeparator = "", $sReplace = "|") If Not IsArray($avArray) Then If Not IsDeclared($ADUpdArr) Then Return SetError(1, 0, 0) Else $avArray = $ADUpdArr EndIf EndIf ; Dimension checking Local $iDimension = UBound($avArray, 0), $iUBound = UBound($avArray, 1) - 1, $iSubMax = UBound($avArray, 2) - 1 If $iDimension > 2 Then Return SetError(2, 0, 0) ; Separator handling ;~ If $sSeparator = "" Then $sSeparator = Chr(1) If $sSeparator = "" Then $sSeparator = Chr(124) ; Declare variables Local $i, $j, $vTmp, $aItem, $avArrayText, $sHeader = "Row", $iBuffer = 64 Local $iColLimit = 250, $iLVIAddUDFThreshold = 4000, $iWidth = 640, $iHeight = 480 Opt("GUIOnEventMode", 1) ;~ Local $iOnEventMode = Opt("GUIOnEventMode", 0) Local $sDataSeparatorChar = Opt("GUIDataSeparatorChar", $sSeparator) ; Swap dimensions if transposing If $iSubMax < 0 Then $iSubMax = 0 If $iTranspose Then $vTmp = $iUBound $iUBound = $iSubMax $iSubMax = $vTmp EndIf ; Set limits for dimensions If $iSubMax > $iColLimit Then $iSubMax = $iColLimit If $iItemLimit = 1 Then $iItemLimit = $iLVIAddUDFThreshold If $iItemLimit < 1 Then $iItemLimit = $iUBound If $iUBound > $iItemLimit Then $iUBound = $iItemLimit If $iLVIAddUDFThreshold > $iUBound Then $iLVIAddUDFThreshold = $iUBound ; Set header up For $i = 0 To $iSubMax $sHeader &= $sSeparator & "Col " & $i Next ; Convert array into text for listview Local $avArrayText[$iUBound + 1] For $i = 0 To $iUBound $avArrayText[$i] = "[" & $i & "]" For $j = 0 To $iSubMax ; Get current item If $iDimension = 1 Then If $iTranspose Then $vTmp = $avArray[$j] Else $vTmp = $avArray[$i] EndIf Else If $iTranspose Then $vTmp = $avArray[$j][$i] Else $vTmp = $avArray[$i][$j] EndIf EndIf ; Add to text array $vTmp = StringReplace($vTmp, $sSeparator, $sReplace, 0, 1) $avArrayText[$i] &= $sSeparator & $vTmp ; Set max buffer size $vTmp = StringLen($vTmp) If $vTmp > $iBuffer Then $iBuffer = $vTmp Next Next $iBuffer += 1 ; GUI Constants Local Const $_ARRAYCONSTANT_GUI_DOCKBORDERS = 0x66 Local Const $_ARRAYCONSTANT_GUI_DOCKBOTTOM = 0x40 Local Const $_ARRAYCONSTANT_GUI_DOCKHEIGHT = 0x0200 Local Const $_ARRAYCONSTANT_GUI_DOCKLEFT = 0x2 Local Const $_ARRAYCONSTANT_GUI_DOCKRIGHT = 0x4 Local Const $_ARRAYCONSTANT_GUI_EVENT_CLOSE = -3 Local Const $_ARRAYCONSTANT_LVIF_PARAM = 0x4 Local Const $_ARRAYCONSTANT_LVIF_TEXT = 0x1 Local Const $_ARRAYCONSTANT_LVM_GETCOLUMNWIDTH = (0x1000 + 29) Local Const $_ARRAYCONSTANT_LVM_GETITEMCOUNT = (0x1000 + 4) Local Const $_ARRAYCONSTANT_LVM_GETITEMSTATE = (0x1000 + 44) Local Const $_ARRAYCONSTANT_LVM_INSERTITEMA = (0x1000 + 7) Local Const $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE = (0x1000 + 54) Local Const $_ARRAYCONSTANT_LVM_SETITEMA = (0x1000 + 6) Local Const $_ARRAYCONSTANT_LVS_EX_FULLROWSELECT = 0x20 Local Const $_ARRAYCONSTANT_LVS_EX_GRIDLINES = 0x1 Local Const $_ARRAYCONSTANT_LVS_SHOWSELALWAYS = 0x8 Local Const $_ARRAYCONSTANT_WS_EX_CLIENTEDGE = 0x0200 Local Const $_ARRAYCONSTANT_WS_MAXIMIZEBOX = 0x00010000 Local Const $_ARRAYCONSTANT_WS_MINIMIZEBOX = 0x00020000 Local Const $_ARRAYCONSTANT_WS_SIZEBOX = 0x00040000 Local Const $_ARRAYCONSTANT_tagLVITEM = "int Mask;int Item;int SubItem;int State;int StateMask;ptr Text;int TextMax;int Image;int Param;int Indent;int GroupID;int Columns;ptr pColumns" Local $iAddMask = BitOR($_ARRAYCONSTANT_LVIF_TEXT, $_ARRAYCONSTANT_LVIF_PARAM) Local $tBuffer = DllStructCreate("char Text[" & $iBuffer & "]"), $pBuffer = DllStructGetPtr($tBuffer) Local $tItem = DllStructCreate($_ARRAYCONSTANT_tagLVITEM), $pItem = DllStructGetPtr($tItem) DllStructSetData($tItem, "Param", 0) DllStructSetData($tItem, "Text", $pBuffer) DllStructSetData($tItem, "TextMax", $iBuffer) ; Set interface up global $ADUpdArr = $avArray If $ADUpdLV Then ; if already open, only update not create _GUICtrlListView_DeleteAllItems(GUICtrlGetHandle($ADUpdLV)) ; Fill listview For $i = 0 To $iLVIAddUDFThreshold GUICtrlCreateListViewItem($avArrayText[$i], $ADUpdLV) Next For $i = ($iLVIAddUDFThreshold + 1) To $iUBound $aItem = StringSplit($avArrayText[$i], $sSeparator) DllStructSetData($tBuffer, "Text", $aItem[1]) ; Add listview item DllStructSetData($tItem, "Item", $i) DllStructSetData($tItem, "SubItem", 0) DllStructSetData($tItem, "Mask", $iAddMask) GUICtrlSendMsg($ADUpdLV, $_ARRAYCONSTANT_LVM_INSERTITEMA, 0, $pItem) ; Set listview subitem text DllStructSetData($tItem, "Mask", $_ARRAYCONSTANT_LVIF_TEXT) For $j = 2 To $aItem[0] DllStructSetData($tBuffer, "Text", $aItem[$j]) DllStructSetData($tItem, "SubItem", $j - 1) GUICtrlSendMsg($ADUpdLV, $_ARRAYCONSTANT_LVM_SETITEMA, 0, $pItem) Next Next Return EndIf Local $hGUI = GUICreate($sTitle, $iWidth, $iHeight, Default, Default, BitOR($_ARRAYCONSTANT_WS_SIZEBOX, $_ARRAYCONSTANT_WS_MINIMIZEBOX, $_ARRAYCONSTANT_WS_MAXIMIZEBOX)) Local $aiGUISize = WinGetClientSize($hGUI) Local $hListView = GUICtrlCreateListView($sHeader, 0, 0, $aiGUISize[0], $aiGUISize[1] - 26, $_ARRAYCONSTANT_LVS_SHOWSELALWAYS) GUICtrlSetResizing($hListView, $_ARRAYCONSTANT_GUI_DOCKBORDERS) $ADUpdLV = $hListView Local $hCopy = GUICtrlCreateButton("Copy Selected", 3, $aiGUISize[1] - 23, $aiGUISize[0]/2 - 6, 20) GUICtrlSetResizing($hCopy, 513+64) Local $hUpd = GUICtrlCreateButton("Update", $aiGUISize[0]/2 + 6, $aiGUISize[1] - 23, $aiGUISize[0]/2 - 6, 20) GUICtrlSetOnEvent($hUpd,"_ADDef") GUICtrlSetResizing($hUpd, 513+64) GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE, $_ARRAYCONSTANT_LVS_EX_GRIDLINES, $_ARRAYCONSTANT_LVS_EX_GRIDLINES) GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE, $_ARRAYCONSTANT_LVS_EX_FULLROWSELECT, $_ARRAYCONSTANT_LVS_EX_FULLROWSELECT) GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE, $_ARRAYCONSTANT_WS_EX_CLIENTEDGE, $_ARRAYCONSTANT_WS_EX_CLIENTEDGE) ; Fill listview For $i = 0 To $iLVIAddUDFThreshold GUICtrlCreateListViewItem($avArrayText[$i], $hListView) Next For $i = ($iLVIAddUDFThreshold + 1) To $iUBound $aItem = StringSplit($avArrayText[$i], $sSeparator) DllStructSetData($tBuffer, "Text", $aItem[1]) ; Add listview item DllStructSetData($tItem, "Item", $i) DllStructSetData($tItem, "SubItem", 0) DllStructSetData($tItem, "Mask", $iAddMask) GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_INSERTITEMA, 0, $pItem) ; Set listview subitem text DllStructSetData($tItem, "Mask", $_ARRAYCONSTANT_LVIF_TEXT) For $j = 2 To $aItem[0] DllStructSetData($tBuffer, "Text", $aItem[$j]) DllStructSetData($tItem, "SubItem", $j - 1) GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_SETITEMA, 0, $pItem) Next Next ; ajust window width $iWidth = 0 For $i = 0 To $iSubMax + 1 $iWidth += GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_GETCOLUMNWIDTH, $i, 0) Next If $iWidth < 250 Then $iWidth = 230 WinMove($hGUI, "", Default, Default, $iWidth + 20) ; Show dialog GUISetState(@SW_SHOW, $hGUI) GUISetOnEvent(-3, "delADGUI", $hGUI) Opt("GUIDataSeparatorChar", $sDataSeparatorChar) Return 1 EndFunc ;==>_ArrayDisplay Func _ADDef() _AD($ADUpdArr) EndFunc Func delADGUI() ;~ Exit GUIDelete(@GUI_WinHandle) Global $ADUpdLV = 0 Global $ADUpdArr = 0 EndFunc #cs Scite Director interface Stuff askfilename: Return the name of the file being edited. askproperty:<key> Return the value of a property. close: Close the current file. closing: Director is closing - SciTE closes if it was started by the director. currentmacro:<string> Set the current macro to name. cwd: Change the working directory. enumproperties:dyn|local|user|base|embed Enumerate all the properties in the argument set. exportashtml:<path> Save the document in HTML format as the indicated file. exportasrtf:<path> Save the document in RTF format as the indicated file. exportaspdf:<path> Save the document in PDF format as the indicated file. exportaslatex:<path> Save the document in LaTeX format as the indicated file. exportasxml:<path> Save the document in XML format as the indicated file. extender:<command> Call the extension interface with the given command. find:<string> Search for a string, select and show it. focus:<timeStamp> On GTK+ bring this SciTE window to the front. The timeStamp is from the window manager and ensures that windows are only activated because of a user command. Has no effect on Windows as applications on Windows can only donate focus, not take focus. goto:<lineNumber>[,<columnNumber>] Move caret to a particular line and make it visible. If there is a column number then select the word at that column number or move the caret there if no word is present. identity:<hwndDirector> Sets the director window handle to which SciTE sends messages. The argument is in decimal. insert:<value> Display the value in the editor pane replacing the selection. loadsession:<path> Load a session as given by the indicated file. macrocommand:<command> Execute a macro command. See the SciTE source code for the syntax of the command argument. macroenable:<enable> If enable, display menu commands in SciTE for recording and playing macros. macrolist:<list> Display a list for the user to choose from. menucommand:<cmd> Execute a menu command based on numeric ID. open:<path> Open the indicated file. output:<value> Display the value in the output pane replacing the selection. property:<key>=<value> Set a property to a value. quit: Shut down SciTE. reloadproperties: Reload properties from files. replaceall:<search>000<replace> Replace all instances of he search string in the document with the replace string. saveas:<path> Save the document as the indicated file. savesession:<path> Save a session as given by the indicated file. The actions sent by SciTE are: closed:<path> SciTE has closed the indicated file. closing: SciTE is closing. dyn|local|user|base|embed:<key>=<value> Set a property in a set to a value. filename:<path> The file being edited is path. This is the reply to the askfilename: command. identity:<hwndSciTEReceiving> SciTE indicates to the director the window handle to which it should send messages. The argument is in decimal. macro:getlist Retrieve the list of available macros which will be returned by the macrolist command. macro:record:<details> Start recording a macro. See the SciTE source code for the syntax of the details argument. macro:run:<macroName> Run the named macro. macro:stoprecord Stop recording a macro. opened:<path> SciTE has opened the indicated file. switched:<path> SciTE has switched buffers to the indicated file. saved:<path> SciTE has saved the indicated file. PROPERTYS: FilePath full path of the current file FileDir directory of the current file without a trailing slash FileName base name of the current file FileExt extension of the current file FileNameExt $(FileName).$(FileExt) Language name of the lexer used for the current file SessionPath full path of the current session CurrentSelection value of the currently selected text CurrentWord value of word which the caret is within or near Replacements number of replacements made by last Replace command SelectionStartColumn column where selection starts SelectionStartLine line where selection starts SelectionEndColumn column where selection ends SelectionEndLine line where selection ends CurrentMessage most recently selected output pane message SciteDefaultHome directory in which the Global Options file is found SciteUserHome directory in which the User Options file is found SciteDirectoryHome directory in which the Directory Options file is found APIPath list of full paths of API files from api.filepattern AbbrevPath full path of abbreviations file #ce #cs Here are the other values that could be useful for you: Go = 301 Compile = 302 Complete list from the SciTE source file scite.h // Menu IDs. // These are located 100 apart. No one will want more than 100 in each menu #define IDM_MRUFILE 1000 #define IDM_TOOLS 1100 #define IDM_BUFFER 1200 #define IDM_IMPORT 1300 #define IDM_LANGUAGE 1400 // File #define IDM_NEW 101 #define IDM_OPEN 102 #define IDM_OPENSELECTED 103 #define IDM_REVERT 104 #define IDM_CLOSE 105 #define IDM_SAVE 106 #define IDM_SAVEAS 110 #define IDM_SAVEASHTML 111 #define IDM_SAVEASRTF 112 #define IDM_SAVEASPDF 113 #define IDM_FILER 114 #define IDM_SAVEASTEX 115 #define IDM_SAVEACOPY 116 #define IDM_SAVEASXML 117 #define IDM_MRU_SEP 120 #define IDM_PRINTSETUP 130 #define IDM_PRINT 131 #define IDM_LOADSESSION 132 #define IDM_SAVESESSION 133 #define IDM_QUIT 140 #define IDM_ENCODING_DEFAULT 150 #define IDM_ENCODING_UCS2BE 151 #define IDM_ENCODING_UCS2LE 152 #define IDM_ENCODING_UTF8 153 #define IDM_ENCODING_UCOOKIE 154 #define MRU_START 16 #define IMPORT_START 19 #define TOOLS_START 3 // Edit #define IDM_UNDO 201 #define IDM_REDO 202 #define IDM_CUT 203 #define IDM_COPY 204 #define IDM_PASTE 205 #define IDM_CLEAR 206 #define IDM_SELECTALL 207 #define IDM_PASTEANDDOWN 208 #define IDM_FIND 210 #define IDM_FINDNEXT 211 #define IDM_FINDNEXTBACK 212 #define IDM_FINDNEXTSEL 213 #define IDM_FINDNEXTBACKSEL 214 #define IDM_FINDINFILES 215 #define IDM_REPLACE 216 #define IDM_GOTO 220 #define IDM_BOOKMARK_NEXT 221 #define IDM_BOOKMARK_TOGGLE 222 #define IDM_BOOKMARK_PREV 223 #define IDM_BOOKMARK_CLEARALL 224 #define IDM_BOOKMARK_NEXT_SELECT 225 #define IDM_BOOKMARK_PREV_SELECT 226 #define IDM_MATCHBRACE 230 #define IDM_SELECTTOBRACE 231 #define IDM_SHOWCALLTIP 232 #define IDM_COMPLETE 233 #define IDM_COMPLETEWORD 234 #define IDM_EXPAND 235 #define IDM_TOGGLE_FOLDALL 236 #define IDM_TOGGLE_FOLDRECURSIVE 237 #define IDM_EXPAND_ENSURECHILDRENVISIBLE 238 #define IDM_UPRCASE 240 #define IDM_LWRCASE 241 #define IDM_ABBREV 242 #define IDM_BLOCK_COMMENT 243 #define IDM_STREAM_COMMENT 244 #define IDM_COPYASRTF 245 #define IDM_BOX_COMMENT 246 #define IDM_INS_ABBREV 247 #define IDM_JOIN 248 #define IDM_SPLIT 249 #define IDM_DUPLICATE 250 #define IDM_INCSEARCH 252 #define IDM_ENTERSELECTION 256 #define IDC_INCFINDTEXT 253 #define IDC_INCFINDBTNOK 254 #define IDD_FIND2 255 #define IDC_EDIT1 1000 #define IDC_STATIC -1 #define IDM_PREVMATCHPPC 260 #define IDM_SELECTTOPREVMATCHPPC 261 #define IDM_NEXTMATCHPPC 262 #define IDM_SELECTTONEXTMATCHPPC 263 // Tools #define IDM_COMPILE 301 #define IDM_BUILD 302 #define IDM_GO 303 #define IDM_STOPEXECUTE 304 #define IDM_FINISHEDEXECUTE 305 #define IDM_NEXTMSG 306 #define IDM_PREVMSG 307 #define IDM_MACRO_SEP 310 #define IDM_MACRORECORD 311 #define IDM_MACROSTOPRECORD 312 #define IDM_MACROPLAY 313 #define IDM_MACROLIST 314 #define IDM_ACTIVATE 320 #define IDM_SRCWIN 350 #define IDM_RUNWIN 351 #define IDM_TOOLWIN 352 #define IDM_STATUSWIN 353 #define IDM_TABWIN 354 // Options #define IDM_SPLITVERTICAL 401 #define IDM_VIEWSPACE 402 #define IDM_VIEWEOL 403 #define IDM_VIEWGUIDES 404 #define IDM_SELMARGIN 405 #define IDM_FOLDMARGIN 406 #define IDM_LINENUMBERMARGIN 407 #define IDM_VIEWTOOLBAR 408 #define IDM_TOGGLEOUTPUT 409 #define IDM_VIEWTABBAR 410 #define IDM_VIEWSTATUSBAR 411 #define IDM_TOGGLEPARAMETERS 412 #define IDM_OPENFILESHERE 413 #define IDM_WRAP 414 #define IDM_WRAPOUTPUT 415 #define IDM_READONLY 416 #define IDM_CLEAROUTPUT 420 #define IDM_SWITCHPANE 421 #define IDM_EOL_CRLF 430 #define IDM_EOL_CR 431 #define IDM_EOL_LF 432 #define IDM_EOL_CONVERT 433 #define IDM_TABSIZE 440 #define IDM_MONOFONT 450 #define IDM_OPENLOCALPROPERTIES 460 #define IDM_OPENUSERPROPERTIES 461 #define IDM_OPENGLOBALPROPERTIES 462 #define IDM_OPENABBREVPROPERTIES 463 #define IDM_OPENLUAEXTERNALFILE 464 //#define IDM_SELECTIONMARGIN 490 //#define IDM_BUFFEREDDRAW 491 //#define IDM_USEPALETTE 492 // Buffers #define IDM_PREVFILE 501 #define IDM_NEXTFILE 502 #define IDM_CLOSEALL 503 #define IDM_SAVEALL 504 #define IDM_BUFFERSEP 505 #define IDM_PREVFILESTACK 506 #define IDM_NEXTFILESTACK 507 // Help #define IDM_HELP 901 #define IDM_ABOUT 902 #define IDM_HELP_SCITE 903 // Windows specific windowing options #define IDM_ONTOP 960 #define IDM_FULLSCREEN 961 // Dialog control IDs #define IDGOLINE 220 #define IDABOUTSCINTILLA 221 #define IDFINDWHAT 222 #define IDFILES 223 #define IDDIRECTORY 224 #define IDCURRLINE 225 #define IDLASTLINE 226 #define IDEXTEND 227 #define IDTABSIZE 228 #define IDINDENTSIZE 229 #define IDUSETABS 230 #define IDREPLACEWITH 231 #define IDWHOLEWORD 232 #define IDMATCHCASE 233 #define IDDIRECTIONUP 234 #define IDDIRECTIONDOWN 235 #define IDREPLACE 236 #define IDREPLACEALL 237 #define IDREPLACEINSEL 238 #define IDREGEXP 239 #define IDWRAP 240 #define IDUNSLASH 241 #define IDCMD 242 // id for the browse button in the grep dialog #define IDBROWSE 243 #define IDABBREV 244 #define IDREPLACEINBUF 244 #define IDMARKALL 245 #define IDGOLINECHAR 246 #define IDCURRLINECHAR 247 #define IDREPLDONE 248 #define IDDOTDOT 249 #define IDFINDINSTYLE 250 #define IDFINDSTYLE 251 #define IDPARAMSTART 300 // Dialog IDs #define IDD_FIND 400 #define IDD_REPLACE 401 #define IDD_BUFFERS 402 #define IDD_FIND_ADV 403 #define IDD_REPLACE_ADV 404 #define IDR_CLOSEFILE 100 #ce There are more functions included to assist scripting in Scite. - nothing marked and middle mouse button (no drag) will insert [] and put cursor in middle - nothing marked and Thumb Button 1 will insert "" and put cursor in middle - Thumb Button 2 does '&' - mark a word and press Thumb Button 1 it will put the selection in "" - mark a word, press and hold Thumb Button 1. Now type in an abbreviation like 'cw' and let go. It will insert the abbreviation and inside the word. and the function i have problems with: - click on any word with middle mouse and drag it to somewhere else will copy it there. If you write an abbrev while dragging, it will put the word in the abbrev. and there is a "fast access last used variables" list which is unfinished and now only a array, but you can make it visible if you uncomment line 152 If you have suggestions how to make other functions better, i would be very thankful