|
|
| Title | ButtonBarTools |
| File Name | ButtonBarTools-B.txt |
| Description | See comments |
| Author | Vochomurka |
| Parameters | Stat, ClipBoard, SourceBar, TargetBar, From, To |
| Plugins Called | vec, ini, file, clip |
| Icon |
|
| Version | 1.0 |
| Updated on | 23.06.2017 |
args Stat, ClipBoard, SourceBar, TargetBar, From, To
static Buf = 0
if(ClipBoard || Shift)
Buf = 1
static BB = "Buttonbar"
static BC = "Buttoncount"
static w = vec.createfromwords("button cmd param path menu iconic")
if(not w) do
messagebox("ok error", "Failure creating vector", "VEC plugin Error #4")
quit
endif
if(arg(0) > 2)
.@Batch(SourceBar, TargetBar, From, To)
static Config = pprofolder ++ "scripts\ini\ButtonBarTools.ini"
static Height = ini.get(Config, "General", "Height")
static CR = esc(?+\r+, ?+\+)
local i
flag clear 1
if(Ctrl || Stat) do
local Rep = pprofolder ++ "ButtonBars.ini"
local fh = file.open(Rep, "w")
if(fh <= 0) do
messagebox("ok error", "File not created", "FILE plugin error #1")
quit
endif
file.close(fh)
local Bars, Buttons, Counter, j, Temp
for each line i in ini.enum_sections(Config)
if(i != "General") do
.@Read(i)
else
.@Read()
endif
Counter = v.length
Bars += Counter
for(j = 0; j < Counter; j++)
Temp = ini.get(v[j], BB, BC)
ini.set(Rep, i, v[j], Temp)
Buttons += Temp
endfor
ini.set(Rep, "Summary", "Bars", Bars)
ini.set(Rep, "Summary", "Buttons", Buttons)
endfor
Temp = "File " ++ Rep ++ " created" ++ CR ++ CR ++ "Bars: " ++ Bars ++ CR ++ "Buttons: " ++ Buttons
messagebox("ok", Temp, "ButtonBarTools script")
quit
endif
static D = cl.Create("Dirs", 1)
for each line i in ini.enum_sections(Config)
if(i != "General") do
D.Insert(0)
D.AddLeft(0, cb("@Read", i))
D.SetLabel(0, i)
endif
endfor
D.Insert(0)
D.AddLeft(0, cb("@Read"))
D.SetLabel(0, "Main Bars")
if(D.Length > 1)
*menu show Dirs
.@GetBars()
*menu show Bars
quit all
;;************************************************
Function Read(Sec)
local Mask = "*.bar"
local Temp, Str, List, Elem, Counter, Path
static v
if(vec.exists(v))
v.destroy
if(not Sec) do
local hh = win.handle("c=TTOTAL_CMD")
Path = file.folder(win.exepath(hh))
Temp = file.listfiles(Path ++ "\" ++ Mask)
v = vec.createfromlines(Temp)
if(v <= 0)
messagebox("ok error", "Vector not created", "VEC plugin error #1")
quit
endif
v = vec.create(1, 1)
if(v <= 0) do
messagebox("ok error", "Vector not created", "VEC plugin error #2")
quit
endif
Str = ini.enum_keys(Config, Sec)
for each line Temp in Str
Elem = ini.get(Config, Sec, Temp)
if(Sec == "Local Bars") do
v[Counter] = Elem ++ "_local.bar"
Counter++
else
List = file.listfiles(Elem ++ Mask)
for each line Elem in List
v[Counter] = Elem
Counter++
endfor
endif
endfor
quit
;;************************************************
Function Left(i)
if(pproflag(1)) do
static Target = v[i]
quit
endif
flag set 1
static Source = v[i]
static Items = ini.get(Source, BB, BC)
static B = cl.Create("Bar", 1)
setstring Quote "
local i, Str, Counter, TT, Param, Work, How, Menu, IconFile, Icon, Command, Temp
if(not Buf) do
B.Insert(0)
B.AddLeft(0, cb("@Copy"))
B.AddRight(0, cb("@Clip"))
B.SetLabel(0, "OK")
B.SetTooltip(0, "Left: Copy Buttons/Right: Put 1 Button to Clip")
B.SetIcon(0, env("WINDIR") ++ "\system32\comres.dll", 8)
B.SetBackColor(0, "128 255 128")
B.SetHeight(0, 24)
B.Insert(0)
B.AddLeft(0, "*bar close Bar")
B.SetLabel(0, "Cancel")
B.SetIcon(0, env("WINDIR") ++ "\system32\comres.dll", 10)
B.SetBackColor(0, "255 128 128")
B.SetHeight(0, 24)
B.SetTooltip(0, "Close Bar")
endif
for(i = Items; i >= 1; i--)
B.Insert(0)
if(ini.check_exists(Source, BB, "cmd" ++ i) == 2) do
if(Buf) do
B.AddLeft(0, "Format Separator")
else
B.SetLabel(0, "Separator")
B.SetBackColor(0, 0)
B.SetTextColor(0, "255 255 255")
B.SetToolTip(0, "Button #" ++ i ++ "/Left: Close")
B.AddLeft(0, "*bar close Bar")
endif
continue
endif
Command = ini.get(Source, BB, "cmd" ++ i)
Command = .@CheckLength(Command)
if(Command == -2) do
Counter = 0
if(Buf) do
B.AddLeft(0, "Format NewColumnLine")
else
B.SetLabel(0, "New Column")
B.SetBackColor(0, 0)
B.SetTextColor(0, "255 255 255")
B.SetToolTip(0, "Button #" ++ i ++ "/Left: Close")
B.AddLeft(0, "*bar close Bar")
endif
continue
endif
TT = "Button #" ++ i ++ "/Command: " ++ Command
if(ini.check_exists(Source, BB, "param" ++ i) == 3) do
Param = ini.get(Source, BB, "param" ++ i)
Param = .@CheckLength(Param)
TT ++= "/Parameters: " ++ Param
else
Param = ""
endif
if(ini.check_exists(Source, BB, "path" ++ i) == 3) do
Work = ini.get(Source, BB, "path" ++ i)
TT ++= "/Start path: " ++ Work
else
Work = ""
endif
if(ini.check_exists(Source, BB, "menu" ++ i) == 3) do
Menu = ini.get(Source, BB, "menu" ++ i)
TT ++= "/Tooltip: " ++ Menu
Menu = replacechars(Menu, Quote, "''")
else
Menu = Command
endif
if(ini.check_exists(Source, BB, "iconic" ++ i) == 3) do
How = ini.get(Source, BB, "iconic" ++ i)
else
How = ""
endif
B.SetToolTip(0, TT)
if(Buf) do
B.SetLabel(0, Menu)
B.AddLeft(0, cb("@Buffer", i))
else
B.SetLabel(0, "*control button autocheckbox" ++ Quote ++ Menu ++ Quote)
endif
if(ini.check_exists(Source, BB, "button" ++ i) == 3) do
Str = ini.get(Source, BB, "button" ++ i)
if(validpath(Str)) do
IconFile = Str
B.SetIcon(0, IconFile)
Icon = ""
else
IconFile = nextword(Str, "Icon", ",")
B.SetIcon(0, IconFile, Icon)
endif
endif
Str = "TOTALCMD#BAR#DATA" ++ CR ++ Command ++ CR ++ Param ++ CR
Str ++= IconFile ++ Icon ++ CR ++ Menu ++ CR ++ Work ++ CR ++ How
B.AddRight(0, Str)
if(Buf && Counter > Height) do
B.Insert(0)
B.AddLeft(0, "Format NewColumnLine")
Counter = 0
else
Counter++
endif
endfor
B.SetProperties("Format=barsize position: leftcaption samesize vertical iconsize: 16 tooltips")
if(Buf) do
*menu show Bar
quit
endif
B.show
quit
;;************************************************
Function Clip()
local i
for(i = 0; i < B.Length; i++)
if(B.GetCtrlValue(i)) do
clip.set(B.GetRightCmd(i))
B.SetCtrlValue(i, 0)
break
endif
endfor
quit
;;************************************************
Function Buffer(Num)
local Str = B.GetRightCmd(Num - 1)
clip.set(Str)
quit all
;;************************************************
Function Copy()
local i, Elem, i1, Counter, Temp, Str
if(D.Length > 1)
*menu show Dirs
.@GetBars()
*menu show Bars
local Buttons = ini.get(Target, BB, BC)
local Next = Buttons
for(i = 0; i < B.Length; i++)
if(B.GetCtrlValue(i)) do
i1 = i + 1
Counter++
Next++
for each Elem in w
Temp = Elem ++ i1
if(ini.check_exists(Source, BB, Temp) == 3) do
Str = ini.get(Source, BB, Temp)
ini.set(Target, BB, Elem ++ Next, Str)
endif
endfor
endif
endfor
B.close
ini.set(Target, BB, BC, Buttons + Counter)
Str = Counter ++ " buttons are successfully copied from " ++ Source ++ " to " ++ Target
messagebox("ok", Str, "ButtonBarTools Script")
quit
;;************************************************
Function Batch(SourceBar, TargetBar, From, To)
local i, Str, Counter, Temp, Elem
local Buttons = ini.get(TargetBar, BB, BC)
local Next = Buttons
if(not validpath(TargetBar)) do
Str = "Target bar file name " ++ TargetBar ++ " is wrong"
messagebox ("ok", Str, "ButtonBarTools Script")
quit
endif
if(not validpath(SourceBar)) do
Str = "Source bar file name " ++ SourceBar ++ " is wrong"
messagebox ("ok", Str, "ButtonBarTools Script")
quit
endif
if(From > To) do
Str = "Starting button number " ++ From ++ " is more than ending number " ++ To
messagebox ("ok", Str, "ButtonBarTools Script")
quit
endif
i = ini.get(SourceBar, BB, BC)
if(i < To) do
Str = "Button count in " ++ SourceBar ++ " is " ++ i ++ " and is less than ending number " ++ To
messagebox ("ok", Str, "ButtonBarTools Script")
quit
endif
for(i = From; i <= To; i++)
Counter++
Next++
for each Elem in w
Temp = Elem ++ i
if(ini.check_exists(SourceBar, BB, Temp) == 3) do
Str = ini.get(SourceBar, BB, Temp)
ini.set(TargetBar, BB, Elem ++ Next, Str)
endif
endfor
endfor
ini.set(TargetBar, BB, BC, Buttons + Counter)
Str = Counter ++ " buttons are successfully copied from " ++ SourceBar ++ " to " ++ TargetBar
messagebox ("ok", Str, "ButtonBarTools Script")
quit all
;;************************************************
Function GetBars()
static Bs = cl.Create("Bars", 1)
Bs.NewProperties("tooltips")
local Number = v.length
for(i = Number - 1; i >= 0; i--)
Bs.Insert(0)
Bs.AddLeft(0, cb("@Left", i))
Temp = file.name(v[i])
Bs.SetLabel(0, Temp)
Temp = ini.get(v[i], BB, BC)
Bs.SetTooltip(0, v[i] ++ "/" ++ Temp ++ " buttons")
endfor
for(i = 1; i <= Number/Height; i++)
Bs.Insert(i*Height)
Bs.AddLeft(i*Height, "Format NewColumnLine")
endfor
quit
;;************************************************
Function CheckLength(Str)
static MT = B.GetMaxtext
local Text
if(length(Str) > MT) do
Text = "String for command #" ++ i ++ " is longer than " ++ MT
Text ++= " characters." ++ CR ++ "String is truncated"
messagebox("ok", Text, "ButtonBarTools Script")
Str = remove(Str, Temp - length(Str) - 200)
endif
quit(Str)
How to transfer buttons from one button bar to another? First, we can use the clipboard: open source panel, copy one button to the clipboard, open target panel, paste button, open source panel again, etc. Second, we can copy all buttons to the clipboard and then paste them one by one using a clipboard manager, if any. Third, we can merge panels (using, for example, this script), and then delete excessive buttons. Fourth, we can open both panels in text editor and carefully change numbers...
So, existing ways are not handy. On my computer there are 2064 buttons on 137 bars in various directories, so the button transition from one panel to another is a problem. This script is used to solve it. Its early edition was called Button2Clip and allowed to copy only one button and only to the clipboard. The present edition has more functions.
First of all let's have a look at the configuration file ButtonBarTools.ini. Its path has to be pprofolder\scripts\inis\ButtonBarTools.ini, where pprofolder is the path PowerPro is installed in. ButtonBarTools.ini has one obligatory section [General] with one obligatory key Height described below.
To use local panels (or local menus; they are described here) section with obligatory name [Local Bars] must contain strings like
Any_name=path_to_local_menu\
Local menus must have names _local.bar. If local menus are not used, the [Local Bars] section must be completely deleted or commented.
Further, the configuration file can contain other sections with any names each with any numbers of keys with the same format. Unlike the [Local Bars] section, other ones have no restrictions to both button bar file names and their quantity: all *.bar files with indicated path will be considered.
The script has five modes whose execution is provided by parameters and button presses.
Script has no parameters. First, the menu of bar groups appears. For the presented configuration this menu contains three groups: second is above described "Local bars", third is "Other bars", and the first one is obligatory group "Main bars" containing all *.bar files located in %COMMANDER_PATH%. If the configuration files contains only the [General] section, then the bar group menu is not shown at all, and the next bar menu is displayed at once.
After picking one of groups its contents is presented with bars of this group. Maximum number of items in the menu column is set by the above mentioned Height key in the configuration file. Detailed info about each bar is given by the tooltip. Finally, after picking one bar the third menu of buttons is shown. "Empty buttons" are replaced with pseudo-buttons "Separator", buttons with the "-2" command: with "New Column" pseudo-buttons. All pseudo-buttons have black background with white foreground. So, a regular Total Commander button bar looks some unusual way. Moreover, this menu can not fit into the screen.
If this happens and the button of interest is out of visible limits, the menu can be closed by left-clicking any of pseud-buttons. If they are not visible either, the menu can be closed by right-clicking any button with Ctrl pressed, and then by picking the "Close Bar" command. To copy several buttons the batch mode (see below) can be used instead.
If all the buttons of interest are visible, you can check boxes to the left of buttons. After checking left-click the OK button. Then the first two steps: group menu and bar menu appear in turn, but now you have to pick the bar where the buttons have to be copied to. Finally, the script informs that this operation is done successfully.
Note that buttons are copied rather than moved! First, it is safely, second, it is sometimes useful to have the same buttons on different bars.
After displaying the above described button menu the OK button can be not left- but right-clicked. Then the first checked button image is put to the clipboard. That allows to position the mouse cursor over the active TC button bar, right-click and pick "Paste". After changing the active button bar this operation can be repeated with the same or another button from the button menu.
This mode is set with the second script parameter equal to 1. Alternatively you can press Shift at starting the script.
First two steps - group menu and bar menu - are the same as above. But the button menu looks different and more close to the TC button bar: first, empty buttons and new columns are shown correctly. Second - buttons have icons, if possible. Third - all buttons are visible.
Result of left-clicking a button is the same as in the second mode: the button image is put to the clipboard. Third mode is more pictorial and comfortable, but allow to process only one button per one script execution.
This mode is useful in two cases: if buttons of interest are not visible in the first mode, and if the copying task is repetitive.
Script parameters from third to sixth have the following meanings:
source_panel, target_panel, starting_number, ending_number
Panels can be set both as TC parameters like %T%M and as implicit full file names.
Unlike the main mode, the batch one allows to copy only sequential buttons.
Example: script with parameters
.ButtonBarTools(0, 0, ?"%P%N", "c:\some\dir\any.bar", 7, 11)
copies 5 buttons with numbers 7-11 from panel under cursor to panel c:\some\dir\any.bar.
First script parameter must be set to 1 (or Ctrl must be pressed at starting the script). In the PowerPro home directory the ButtonBars.ini file containing information about all button bars, is created.
|
Main Page |
|
Total Commander |
|
PowerPro |
|
|